linux获取daemon进程的控制台数据下载

系统大全为您分享
linux分享了一个daemon函数,使得进程可以脱离控制台运行,实现了后台运行的效果。但是进程后台运行后,原本在终端控制台输出的数据就看不到了。那么,怎样才能找回这些数据? 这里,文章主题就围绕着 如何获得后台进程的控制台数据,其中的原理要从daemon说起。 daemon主要做两件事:1、创建子进程,退出当前进程,并且知识兔以子进程创建新会话。这样,就算父进程退出,子进程也不会被关闭2、知识兔将标准输入,标准输出,标准错误都重定向/dev/nulldaemon 实现大致如下:int daemonize(int nochdir, int noclose) { int fd; switch (fork()) {case -1:return (-1);case 0:break;default:_exit(EXIT_SUCCESS);} if (setsid() == -1)return (-1); if (nochdir == 0) {if(chdir(“/”) != 0) {perror(“chdir”);return (-1);}} if (noclose == 0 && (fd = open(“/dev/null”, O_RDWR, 0)) != -1) {if(dup2(fd, STDIN_FILENO) < 0) {perror("dup2 stdin");return (-1);}if(dup2(fd, STDOUT_FILENO) < 0) {perror("dup2 stdout");return (-1);}if(dup2(fd, STDERR_FILENO) < 0) {perror("dup2 stderr");return (-1);} if (fd > STDERR_FILENO) {if(close(fd) < 0) {perror("close");return (-1);}}}return (0);}所以,想取回进程的控制台数据,只要将标准输出,标准错误重定向到指定文件,然后知识兔读取这个文件就好了。 文章这里写了个例子,简单演示下(这里通过kill信号完成进程通信,有点粗暴)代码如下,保存为 daemon_example.c#include #include #include #include  static int fd = -1; void sigroutine(int dunno) {switch (dunno) {case SIGUSR1:fprintf(stderr, "Get a signal -- SIGUSR1 ");if (fd != -1) close(fd);fd = open("/tmp/console_temp.log", O_RDWR|O_APPEND|O_CREAT, 0600);if (fd == -1) break;dup2(fd, STDIN_FILENO);dup2(fd, STDOUT_FILENO);dup2(fd, STDERR_FILENO);break; case SIGUSR2:fprintf(stderr, "Get a signal -- SIGUSR2 ");if (fd != -1) close(fd);fd = open("/dev/null", O_RDWR, 0);if (fd == -1) break;dup2(fd, STDIN_FILENO);dup2(fd, STDOUT_FILENO);dup2(fd, STDERR_FILENO);break;}return; } int main() {signal(SIGUSR1, sigroutine);signal(SIGUSR2, sigroutine); daemon(1,0);for (;;){fprintf(stderr,"test ") ; // 不断打印testsleep(1);}return 0;}然后知识兔,编译和执行这个程序:$ gcc -o daemon_example daemon_example.c$ chmod +x daemon_example$ ./daemon_example$ ps -ef| grep daemon_exampleroot 11328 1 0 19:15 ? 00:00:00 ./daemon_example如上,进程后台运行了,拿到pid 11328 接着,写个脚本测试这个程序, 保存为test.sh:#!/bin/bash pid=$1ps -p $pid>/dev/nullif [ ! $? -eq 0 ] ; thenecho pid does not exist!exit 1fiecho pid $pidtrap “kill -usr2 $pid && exit 1” HUP INT QUIT TERMkill -usr1 $pidecho it works,please wait..sleep 1tail -f -n 0 /tmp/console_temp.logecho done!执行这个脚本,结果如下:$ ./test.sh 11328pid 11328it works,please wait..testtest然后知识兔,按ctrl+c 退出脚本,这时脚本会通知进程将标准输出和标准错误重定向到 /dev/null,继续后台运行。这样,这个脚本就成了后台进程的调试工具了,需要后台数据的时候执行一下,不需要就关闭。当然,这只是一个示例,实际应用中要做改善,比如kill信号改成pipe或socket通讯,缓存文件要限制大小,或自动清除等。
经验总结:
  
  以上就是系统大全给大家介绍的如何使的方法都有一定的了解了吧,好了,如果知识兔大家还想了解更多的资讯,那就赶紧点击系统大全官网吧。 
 
本文来自系统大全http://www.win7cn.com/如需转载请注明!推荐:win7纯净版
 

下载仅供下载体验和测试学习,不得商用和正当使用。

下载体验

请输入密码查看下载!

如何免费获取密码?

点击下载

评论