init进程接管孤儿进程的验证

 
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include<stdlib.h>
#include<signal.h>
int main(int argc , char **argv)
{ int id;
 id=fork();
 if(id<0)
  {
  printf("fork error\n");
  }
 else if(id==0)
  {
   printf("I‘m in child process%d parent process%d\n",getpid(),getppid());
   sleep(120);
   exit(0);
   }
 else if(id>0)
   {
   printf("I‘m in parent process%d\n",getpid());
   }

  return 0;
}

[[email protected] Desktop]# gcc 僵尸进程.c
[[email protected] Desktop]# ./a.out
I‘m in parent process4308
[[email protected] Desktop]# I‘m in child process4309 parent process 1

[[email protected] Desktop]#
从上面的输出结果可以看出孩子进程4309的父进程是1号进程也就是init进程,这是因为子进程的父进程死亡后
子进程被init进程接管!所以说输出他的父进程号为1;

[[email protected] Desktop]# ps --ppid 1
  PID TTY          TIME CMD
  494 ?        00:00:00 udevd
 1474 ?        00:00:00 vmware-vmblock-
 1494 ?        00:00:20 vmtoolsd
 1640 ?        00:00:00 portreserve
 1647 ?        00:00:00 rsyslogd
 1700 ?        00:00:02 dbus-daemon
 1711 ?        00:00:00 NetworkManager
 1717 ?        00:00:00 modem-manager
 1723 ?        00:00:00 avahi-daemon
 1733 ?        00:00:00 wpa_supplicant
 1737 ?        00:00:00 cupsd
 1762 ?        00:00:00 acpid
 1771 ?        00:00:00 hald
 1840 ?        00:00:00 sshd
 1878 ?        00:00:00 tpvmlp
 1951 ?        00:00:00 mysqld_safe
 2113 ?        00:00:00 abrtd
 2121 ?        00:00:00 abrt-dump-oops
 2129 ?        00:00:01 crond
 2140 ?        00:00:00 atd
 2155 ?        00:00:00 rhsmcertd
 2171 ?        00:00:00 gdm-binary
 2178 tty2     00:00:00 mingetty
 2180 tty3     00:00:00 mingetty
 2182 tty4     00:00:00 mingetty
 2190 tty5     00:00:00 mingetty
 2192 tty6     00:00:00 mingetty
 2229 ?        00:00:00 console-kit-dae
 2299 ?        00:00:00 dbus-launch
 2315 ?        00:00:00 devkit-power-da
 2323 ?        00:00:00 auditd
 2383 ?        00:00:00 polkitd
 2389 ?        00:00:00 rtkit-daemon
 2414 ?        00:00:00 gnome-keyring-d
 2432 ?        00:00:00 dbus-launch
 2433 ?        00:00:00 dbus-daemon
 2447 ?        00:00:01 gconfd-2
 2452 ?        00:00:20 gnome-settings-
 2457 ?        00:00:00 seahorse-daemon
 2462 ?        00:00:00 gvfsd
 2468 ?        00:00:00 gvfs-fuse-daemo
 2487 ?        00:00:00 bonobo-activati
 2495 ?        00:00:13 wnck-applet
 2496 ?        00:00:00 trashapplet
 2499 ?        00:00:39 vmtoolsd
 2503 ?        00:00:00 gvfs-gdu-volume
 2510 ?        00:00:00 udisks-daemon
 2516 ?        00:00:03 pulseaudio
 2541 ?        00:00:00 gvfs-gphoto2-vo
 2543 ?        00:00:01 gvfs-afc-volume
 2555 ?        00:00:00 clock-applet
 2556 ?        00:00:00 gdm-user-switch
 2557 ?        00:00:00 gnote
 2558 ?        00:00:00 notification-ar
 2563 ?        00:00:00 restorecond
 2566 ?        00:00:00 gvfsd-trash
 2573 ?        00:00:12 gnome-screensav
 2665 ?        00:00:00 gvfsd-burn
 2677 ?        00:00:00 gvfsd-metadata
 2706 ?        00:00:08 notification-da
 2725 ?        00:00:44 gnome-terminal
 2783 ?        00:00:44 gedit
 4309 pts/0    00:00:00 a.out   注意下面这句没有输出

[[email protected] Desktop]# ps --ppid 1
  PID TTY          TIME CMD
  494 ?        00:00:00 udevd
 1474 ?        00:00:00 vmware-vmblock-
 1494 ?        00:00:20 vmtoolsd
 1640 ?        00:00:00 portreserve
 1647 ?        00:00:00 rsyslogd
 1700 ?        00:00:02 dbus-daemon
 1711 ?        00:00:00 NetworkManager
 1717 ?        00:00:00 modem-manager
 1723 ?        00:00:00 avahi-daemon
 1733 ?        00:00:00 wpa_supplicant
 1737 ?        00:00:00 cupsd
 1762 ?        00:00:00 acpid
 1771 ?        00:00:00 hald
 1840 ?        00:00:00 sshd
 1878 ?        00:00:00 tpvmlp
 1951 ?        00:00:00 mysqld_safe
 2113 ?        00:00:00 abrtd
 2121 ?        00:00:00 abrt-dump-oops
 2129 ?        00:00:01 crond
 2140 ?        00:00:00 atd
 2155 ?        00:00:00 rhsmcertd
 2171 ?        00:00:00 gdm-binary
 2178 tty2     00:00:00 mingetty
 2180 tty3     00:00:00 mingetty
 2182 tty4     00:00:00 mingetty
 2190 tty5     00:00:00 mingetty
 2192 tty6     00:00:00 mingetty
 2229 ?        00:00:00 console-kit-dae
 2299 ?        00:00:00 dbus-launch
 2315 ?        00:00:00 devkit-power-da
 2323 ?        00:00:00 auditd
 2383 ?        00:00:00 polkitd
 2389 ?        00:00:00 rtkit-daemon
 2414 ?        00:00:00 gnome-keyring-d
 2432 ?        00:00:00 dbus-launch
 2433 ?        00:00:00 dbus-daemon
 2447 ?        00:00:01 gconfd-2
 2452 ?        00:00:20 gnome-settings-
 2457 ?        00:00:00 seahorse-daemon
 2462 ?        00:00:00 gvfsd
 2468 ?        00:00:00 gvfs-fuse-daemo
 2487 ?        00:00:00 bonobo-activati
 2495 ?        00:00:13 wnck-applet
 2496 ?        00:00:00 trashapplet
 2499 ?        00:00:39 vmtoolsd
 2503 ?        00:00:00 gvfs-gdu-volume
 2510 ?        00:00:00 udisks-daemon
 2516 ?        00:00:03 pulseaudio
 2541 ?        00:00:00 gvfs-gphoto2-vo
 2543 ?        00:00:01 gvfs-afc-volume
 2555 ?        00:00:00 clock-applet
 2556 ?        00:00:00 gdm-user-switch
 2557 ?        00:00:00 gnote
 2558 ?        00:00:00 notification-ar
 2563 ?        00:00:00 restorecond
 2566 ?        00:00:00 gvfsd-trash
 2573 ?        00:00:12 gnome-screensav
 2665 ?        00:00:00 gvfsd-burn
 2677 ?        00:00:00 gvfsd-metadata
 2706 ?        00:00:08 notification-da
 2725 ?        00:00:44 gnome-terminal
 2783 ?        00:00:44 gedit
[[email protected] Desktop]#
在我测试这两幅图的时候,第一幅图输出后,要等大概两分多钟,也就是大概子进程执行完后,
init进程调用wait会清理掉刚才接收的子进程(4309 )。
子进程4309
//如果将signal(SIGCHLD, SIG_IGN);这行代码加上放在main函数的第一行,应该说会出现一种情况当父进程退出时,父进程的父进程不会理会他,而直接让init进程接管他,但是用ps --ppid 1输出时,没有发现父进程。!只有子进程号!
 
时间: 2024-08-16 10:47:21

init进程接管孤儿进程的验证的相关文章

僵尸进程和孤儿进程----概念

这里仅给出僵尸进程和孤儿进程的概念.来源<深入了解计算机系统(原书第3版)>和网上的博客,下面会给出博客来源. 前言:回收子进程 当一个进程由于某种原因终止时,内核并不是立即把它从系统中清除.相反,进程被保持在一种已终止的状态中,直到被它的父进程回收(reaped).当父进程回收已终止的子进程时,内核将子进程的退出状态传递给父进程,然后抛弃已终止的进程.从此时开始,该进程就不存在了. 1.基本概念 僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitp

【转】僵尸进程和孤儿进程

之前写了进程的创建,由于是半年前做的题目了,现在回忆有点生疏,有些概念都忘了,比如僵尸进程.孤儿进程.子进程和父进程的关系...在博客园看到有一篇讲的很好的关于僵尸进程和孤儿进程的文章,没看到有转载的选项,直接复制过来了,方便以后忘了再查看 转自http://www.cnblogs.com/Anker/p/3271773.html 1.前言 之前在看<unix环境高级编程>第八章进程时候,提到孤儿进程和僵尸进程,一直对这两个概念比较模糊.今天被人问到什么是孤儿进程和僵尸进程,会带来什么问题,怎

fork()、僵死进程和孤儿进程

孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程.孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作. 僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中.这种进程称之为僵死进程. #include <stdio.h> #include <iostream> #include "unistd.

进程——wait与waitpid、僵尸进程与孤儿进程

僵尸进程:子进程终止了,但是父进程没有回收子进程的资源PCB.使其成为僵尸进程 孤儿进程:父进程先与子进程结束了,使得子进程失去了父进程,这个时候子进程会被1号进程init进程领养,成为孤儿进程 为了防止上面两种情况,我们应当在父进程结束之前一定要回收子进程的所有资源 所以出现了wait和waitpid #include <sys/types.h> #include <sys/wait.h> pid_t wait(int *status); pid_t waitpid(pid_t

(转)僵死进程与孤儿进程

在Unix系统编程中,常常会碰到两个概念:僵死进程和孤儿进程.话说我以前曾经把这两个概念弄混淆过. 什么是僵死进程? 我们知道,在Unix进程模型中,进程是按照父进程产生子进程,子进程产生子子进程这样的方式创建出完成各项相互协作功能的进程的.当一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态.如果父进程没有这么做的话,会产生什么 后果呢?此时,子进程虽然已经退出了,但是在系统进程表中还为它保留了一些退出状态的信息,如果父进程一直不取

Linux-进程描述(3)之进程状态僵尸进程与孤儿进程

进程状态 进程状态反映进程执行过程的变化.这些状态随着进程的执行和外界条件的变化而转换.为了弄明正正在运行的进程是什么意思,我们需要知道进程的不同状态.一个进程可以有多个状态(在Linux内核中,进程有时候也叫做任务).下面的状态在 fs/proc/array.c 文件中定义: /* * The task state array is a strange "bitmap" of * reasons to sleep. Thus "running" is zero,

linux的僵尸进程和孤儿进程

1 僵尸进程: 子进程已经退出勒 但是还没有回收资源的进程为僵尸进程 代码验证 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 5 int main() 6 { 7 pid_t pid; 8 if((pid=fork())==-1) 9 { 10 perror("fork error"); 11 12 }else if(pid==0){ 13 printf(&quo

zombie僵尸进程、孤儿进程和守护进程

以前一直对僵尸进程和孤儿进程都没怎么理解,真是罪过,最近在看liunx编程设计(第四版),看到了他们的概念,所以对它们做个总结!加深印象. 基本概念: 我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程再创建新的进程.子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束. 当一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态. 但是如果情况不是这样的会怎么样呢,毕竟世事难料

僵尸进程和孤儿进程-(转自Anker&#39;s Blog)

2.基本概念 我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程.子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束. 当一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态. 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程.孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作. 僵尸进程