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领养。而该进程是不绝不会退出的。
  • 相关阅读:
    Tutorial中代码的区别及不同效果
    Session
    代码解析&Filter用户授权例子
    web后台运作过程
    工厂纸杯生产流水线管理系统
    Webservice和EJB
    Week8——hashcode()和equals()方法
    Week7——JSON
    Week6——Lifecycle of JSF and Facelets
    Week5——Ajax
  • 原文地址:https://www.cnblogs.com/chenchenluo/p/3287438.html
Copyright © 2011-2022 走看看