• (转载)Linux使用prctl API, 在父进程退出后,让子进程也退出


    (转载)http://www.cnblogs.com/cornsea/archive/2010/06/08/1754369.html

    例子1:

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <signal.h>
    #include <sys/prctl.h>
    
    void my_system(void)
    {
        pid_t pid;
        pid = fork();
        if (pid == 0)
        {
            //prctl(PR_SET_PDEATHSIG, SIGHUP);
            while (1)
            {
                printf("child running...\n");
                sleep(1);
            }
            exit(0);
        }
        else if (pid < 0)
        {
            printf("create failed\n");
        }
    }
    
    int main (int argc, char *argv[])
    {
        int i = 0;
        my_system();
    
        while (i++ < 6)
        {
            printf("father running...\n");
            sleep(1);
        }
    
        printf("Main exit()\n");
    
        return 0;
    }

    程序输出:

    [root@localhost ~]# ./a.out
    child running...
    father running...
    child running...
    father running...
    child running...
    father running...
    child running...
    father running...
    child running...
    father running...
    child running...
    father running...
    child running...
    Main exit()
    [root@localhost ~]# child running...
    child running...
    child running...
    child running...
    child running...
    child running...

    可以看到当父进程结束了,子进程还在运行,此时的子进程变成了孤儿进程了。

    例子2:

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <signal.h>
    #include <sys/prctl.h>
    
    void my_system(void)
    {
        pid_t pid;
        pid = fork();
        if (pid == 0)
        {
         // 设置当父进程退出时,子进程也退出
    prctl(PR_SET_PDEATHSIG, SIGHUP); while (1) { printf("child running...\n"); sleep(1); } exit(0); } else if (pid < 0) { printf("create failed\n"); } } int main (int argc, char *argv[]) { int i = 0; my_system(); while (i++ < 6) { printf("father running...\n"); sleep(1); } printf("Main exit()\n"); return 0; }

    程序输出:

    [root@localhost ~]# ./a.out
    child running...
    father running...
    child running...
    father running...
    child running...
    father running...
    child running...
    father running...
    father running...
    child running...
    father running...
    child running...
    child running...
    Main exit()
    [root@localhost ~]#
    [root@localhost ~]#
    [root@localhost ~]#
    从程序输出可以看到当父进程退出了,那么子进程也就退出了。

  • 相关阅读:
    SpringMVC学习笔记----
    各种语言学习
    七步精通Python机器学习 转
    开源GIS有用
    sql 语句
    调试windows服务最简单的方法之一
    sqlserver2008 win7下安装 windows installer错误
    高德地图AmapSDKDemo运行
    google mapsDemo示例运行
    android开发环境搭建遇到的问题
  • 原文地址:https://www.cnblogs.com/Robotke1/p/3064932.html
Copyright © 2020-2023  润新知