1. 程式人生 > >2.4 程序控制之殭屍程序和孤兒程序

2.4 程序控制之殭屍程序和孤兒程序

學習目標:理解殭屍程序和孤兒程序形成的原因

一、孤兒程序

1. 孤兒程序: 父程序先於子程序結束,則子程序成為孤兒程序。子程序成為孤兒程序之後,init程序則會成為其新的父程序,稱為init程序領養孤兒程序。

2. 例程:

 1 #include <stdio.h>
 2 #include <unistd.h>
 3 #include <sys/wait.h>
 4 
 5 int main(void)
 6 {
 7     pid_t pid;
 8     pid = fork();
 9 
10     if (pid == 0) {
11         while
(1) { 12 printf("I am child, my parent pid = %d\n", getppid()); 13 sleep(1); 14 } 15 } else if (pid > 0) { 16 printf("I am parent, my pid is = %d\n", getpid()); 17 sleep(9); 18 printf("------------parent going to die------------\n
"); 19 } else { 20 perror("fork"); 21 return 1; 22 } 23 return 0; 24 }

編譯與執行結果:

二、殭屍程序

1. 殭屍程序:一個程序使用fork建立子程序,如果子程序退出,而父程序並沒有呼叫wait或waitpid獲取子程序的狀態資訊,那麼子程序的程序描述符仍然儲存在系統中。這種程序稱之為僵死程序。

2. 例程:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <unistd.h>
 4
#include <sys/wait.h> 5 6 int main(void) 7 { 8 pid_t pid, wpid; 9 pid = fork(); 10 11 if (pid == 0) { 12 printf("---child, my parent= %d, going to sleep 10s\n", getppid()); 13 sleep(10); 14 printf("-------------child die--------------\n"); 15 } else if (pid > 0) { 16 while (1) { 17 printf("I am parent, pid = %d, myson = %d\n", getpid(), pid); 18 sleep(1); 19 } 20 } else { 21 perror("fork"); 22 return 1; 23 } 24 25 return 0; 26 }

編譯與執行結果: