系統大全為您提供linux提供了一個daemon函數,使得進程可以脫離控制臺運行,實現了后臺運行的效果。但是進程后臺運行后,原本在終端控制臺輸出的數據就看不到了。那么,怎樣才能找回這些數據??這里,文章主題就圍繞著如何獲得后臺進程的控制臺數據,其中的原理要從daemon說起。?daemon主要做兩件事:1、創建子進程,退出當前進程,并且以子進程創建新會話。這樣,就算父進程退出,子進程也不會被關閉2、將標準輸入,標準輸出,標準錯誤都重定向/dev/nulldaemon實現大致如下:intdaemonize(intnochdir,intnoclose)?{?intfd;?switch(fork()){case-1:return(-1);case0: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("dup2stdin");return(-1);}if(dup2(fd,STDOUT_FILENO)<0){perror("dup2stdout");return(-1);}if(dup2(fd,STDERR_FILENO)<0){perror("dup2stderr");return(-1);}?if(fd>STDERR_FILENO){if(close(fd)<0){perror("close");return(-1);}}}return(0);}所以,想取回進程的控制臺數據,只要將標準輸出,標準錯誤重定向到指定文件,然后讀取這個文件就好了。?文章這里寫了個例子,簡單演示下(這里通過kill信號完成進程通信,有點粗暴)代碼如下,保存為daemon_example.c#include?#include?#include?#include??staticintfd=-1;?voidsigroutine(intdunno){switch(dunno){caseSIGUSR1:fprintf(stderr,"Getasignal--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;?caseSIGUSR2:fprintf(stderr,"Getasignal--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;?}?intmain(){signal(SIGUSR1,sigroutine);signal(SIGUSR2,sigroutine);?daemon(1,0);for(;;){fprintf(stderr,"test");//不斷打印testsleep(1);}return0;}然后,編譯和執行這個程序:$gcc-odaemon_exampledaemon_example.c$chmod+xdaemon_example$./daemon_example$ps-ef|grepdaemon_exampleroot113281019:15?00:00:00./daemon_example如上,進程后臺運行了,拿到pid11328?接著,寫個腳本測試這個程序,保存為test.sh:#!/bin/bash?pid=$1ps-p$pid>/dev/nullif[!$?-eq0];thenechopiddoesnotexist!exit1fiechopid$pidtrap"kill-usr2$pid&&exit1"HUPINTQUITTERMkill-usr1$pidechoitworks,pleasewait..sleep1tail-f-n0/tmp/console_temp.logechodone!執行這個腳本,結果如下:$./test.sh11328pid11328itworks,pleasewait..testtest然后,按ctrl+c退出腳本,這時腳本會通知進程將標準輸出和標準錯誤重定向到/dev/null,繼續后臺運行。這樣,這個腳本就成了后臺進程的調試工具了,需要后臺數據的時候執行一下,不需要就關閉。當然,這只是一個示例,實際應用中要做改善,比如kill信號改成pipe或socket通訊,緩存文件要限制大小,或自動清除等。經驗總結:??以上就是系統大全給大家介紹的如何使的方法都有一定的了解了吧,好了,如果大家還想了解更多的資訊,那就趕緊點擊系統大全官網吧。??本文來自系統大全http:///如需轉載請注明!推薦:win7純凈版?