zoukankan      html  css  js  c++  java
  • Linux 下子进程与父进程的关系

    我们知道,Linux下父进程可以使用fork 函数创建子进程,但是当父进程先退出后,子进程会不会也退出呢?

    通过下面这个小实验,我们能够很好的看出来:

    /********  basic.c ********/
    1
    #include "basic.h"

    2 3 pid_t Fork(void) 4 { 5 pid_t pid = fork(); 6 if (pid < 0) { 7 fprintf(stderr, "Fork error: %s ", strerror(errno)); 8 exit(0); 9 } 10 11 return pid; 12 }
     1 **********  basic.h  ***********
     2 
     3 #ifndef __CSAPP_BASIC_H
     4 #define __CSAPP_BASIC_H
     5 
     6 #include <stdio.h>
     7 #include <errno.h>
     8 #include <stdlib.h>
     9 #include <signal.h>
    10 #include <unistd.h>
    11 #include <string.h>
    12 /* function definition concerned with basic.c */
    13 pid_t Fork();
    14 
    15 #endif
     1 *******  fork.c  *********
     2 
     3 #include "basic.h"
     4 
     5 int main()
     6 {
     7     int pid = Fork();
     8     int x = 2;
     9 
    10     if (pid == 0) {
    11         printf("child: pid = %d, ppid = %d, x = %d
    ", getpid(), getppid(), ++x);
    12         sleep(3);
    13         
    14         printf("child: pid = %d, ppid = %d, x = %d
    ", getpid(), getppid(), ++x);
    15         exit(0);
    16     }
    17 
    18     printf("parent: pid = %d, ppid = %d, x = %d
    ", getpid(), getppid(), --x);
    19 
    20 }

    通过 gcc fork.c basic.c -o fork 编译即可的 fork 程序。 运行 ./fork
    可以看出父进程首先退出,退出前child的PPID为12256, 退出后子进程的PPID变为了 1.说明父进程退出后的子进程由 init 超级进程1领养。而该进程是不绝不会退出的。
  • 相关阅读:
    SpringMVC:JSON讲解
    SpringMVC:文件上传和下载
    字符串的使用
    python中的作用域与名称空间
    深、浅copy
    代码块与小数据池之间的关系
    关于敏感字符的筛选替换
    列表的增、删、改、查
    最简三级菜单
    python2.x与python3.x的区别
  • 原文地址:https://www.cnblogs.com/chenchenluo/p/3287438.html
Copyright © 2011-2022 走看看