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

发布时间:2022-11-12 01:19:26阅读:87次
系统大全为您提供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#includestatic 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/bashpid=$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纯净版