當前位置:
首頁 >
linux 守护进程_Linux 守护进程
發(fā)布時間:2024/10/14
100
豆豆
生活随笔
收集整理的這篇文章主要介紹了
linux 守护进程_Linux 守护进程
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
前言
Linux 平臺下,經(jīng)常需要程序脫離終端在后臺運行,很多程序在啟動的時候需要加 -d 參數(shù),這一般代表以守護進程(后臺進進程)的方式啟動。那么怎么啟動守護進程呢?
創(chuàng)建方式
//程序退出的默認動作void?prog_exit(int?signo){std::cout?<"program?recv?signal?"?<"?to?exit."?<std::endl;?????//釋放資源
}
void?daemon_run(){
????int?pid;
????signal(SIGCHLD,?SIG_IGN);
????//1)在父進程中,fork返回新創(chuàng)建子進程的進程ID;
????//2)在子進程中,fork返回0;
????//3)如果出現(xiàn)錯誤,fork返回一個負值;
????pid?=?fork();
????if?(pid?0)
????{
????????std::?cout?<"fork?error"?<std::endl;
????????exit(-1);
????}
????//父進程退出,子進程獨立運行
????else?if?(pid?>?0)?{
????????exit(0);
????}
????//之前parent和child運行在同一個session里,parent是會話(session)的領(lǐng)頭進程,
????//parent進程作為會話的領(lǐng)頭進程,如果exit結(jié)束執(zhí)行的話,那么子進程會成為孤兒進程,并被init收養(yǎng)。
????//執(zhí)行setsid()之后,child將重新獲得一個新的會話(session)id。
????//這時parent退出之后,將不會影響到child了。
????setsid();
????int?fd;
????fd?=?open("/dev/null",?O_RDWR,?0);
????if?(fd?!=?-1)
????{
????????dup2(fd,?STDIN_FILENO);
????????dup2(fd,?STDOUT_FILENO);
????????dup2(fd,?STDERR_FILENO);
????}
????if?(fd?>?2)
????????close(fd);
}
int?main()?{
????//設(shè)置信號處理,為了防止守護進程在沒有運行起來之前,控制終端受到干擾或掛起
????signal(SIGCHLD,?SIG_DFL);
????signal(SIGPIPE,?SIG_IGN);
????signal(SIGINT,?prog_exit);
????signal(SIGKILL,?prog_exit);
????signal(SIGTERM,?prog_exit);
????bool?bdaemon?=?false;
????while?((ch?=?getopt(argc,?argv,?"p:d"))?!=?-1)
????{
????????switch?(ch)
????????{
????????case?'d':
????????????bdaemon?=?true;
????????????break;
????}
????if?(bdaemon)
????????daemon_run();
}
可以將上述代碼放入你的項目中,運行時候加 -d 參數(shù),即可實現(xiàn)守護進程的方式啟動。
總結(jié)
以上是生活随笔為你收集整理的linux 守护进程_Linux 守护进程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python打开文件并读取2进制_在Py
- 下一篇: qt之qml开发优缺点_linux配置v