linux 守护进程-ag凯发k8国际
ag凯发k8国际
收集整理的这篇文章主要介绍了
linux 守护进程_linux 守护进程
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
前言
linux 平台下,经常需要程序脱离终端在后台运行,很多程序在启动的时候需要加 -d 参数,这一般代表以守护进程(后台进进程)的方式启动。那么怎么启动守护进程呢?
创建方式
//程序退出的默认动作void prog_exit(int signo){std::cout <"program recv signal " <" to exit."//释放资源
}
void daemon_run(){
int pid;
signal(sigchld, sig_ign);
//1)在父进程中,fork返回新创建子进程的进程id;
//2)在子进程中,fork返回0;
//3)如果出现错误,fork返回一个负值;
pid = fork();
if (pid 0)
{
std:: cout <"fork error"
}
//父进程退出,子进程独立运行
else if (pid > 0) {
exit(0);
}
//之前parent和child运行在同一个session里,parent是会话(session)的领头进程,
//parent进程作为会话的领头进程,如果exit结束执行的话,那么子进程会成为孤儿进程,并被init收养。
//执行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() {
//设置信号处理,为了防止守护进程在没有运行起来之前,控制终端受到干扰或挂起
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 参数,即可实现守护进程的方式启动。
总结
以上是ag凯发k8国际为你收集整理的linux 守护进程_linux 守护进程的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇:
- 下一篇: