欢迎访问 生活随笔!

ag凯发k8国际

当前位置: ag凯发k8国际 > 运维知识 > linux >内容正文

linux

linux 守护进程-ag凯发k8国际

发布时间:2024/10/14 linux 28 豆豆
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"         exit(-1);
    }
    //父进程退出,子进程独立运行
    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 守护进程的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得ag凯发k8国际网站内容还不错,欢迎将ag凯发k8国际推荐给好友。

  • 上一篇:
  • 下一篇:
网站地图