1、進程的創建
編寫一段程序,使用系統調用fork( )創建兩個子進程,在系統中有一個父進程和兩個子進程活動。讓每個進程在屏幕上顯示一個字符;父進程顯示字符“a”,子進程分別顯示字符“b” 和“c”。試觀察記錄屏幕上的顯示結果,並分析原因。
1 # include<stdio.h> 2 3 main() 4 5 { int p1, p2; 6 7 while((p1=fork())= = -1); 8 9 if(p1= =0) 10 11 putchar(‘b’); 12 13 else 14 15 { while((p2=fork())= =-1); 16 17 if(p2= =0) 18 19 putchar(‘c’); 20 21 else 22 23 putchar( ‘a’); 24 25 } 26 27 }
2、 修改已編寫的程序,將每個進程的輸出由單個字符改為一句話,再觀察程序執行時屏幕上出現的現象,並分析其原因。
1 # include<stdio.h> 2 main() 3 { int p1, p2, i; 4 while((p1=fork())= = -1); 5 if(p1= =0) 6 for(i=0;i<500;i++) 7 printf(“child%d\n”,i); 8 else 9 { while((p2=fork())= =-1); 10 If(p2= =0) 11 for(i=0;i<500;i++) 12 printf(“son%d\n”,i); 13 else 14 for(i=0;i<500;i++) 15 printf(“daughter%d\n”,i); 16 } 17 }
3、編寫程序創建進程樹如圖1和圖2所示,在每個進程中顯示當前進程識別碼和父進程識別碼。
圖一
#include<stdio.h> //#include<sys/types.h> /* 提供類型pid_t的定義 */ #include<unistd.h> /* 提供函數的定義 */ int main() { int p1,p2,p3; while((p1=fork())== -1); if(p1==0) { while((p2=fork())==-1); if(p2==0) { while((p3=fork())==-1); if(p3==0) { // putchar('d'); printf("I am D,My pid is %d, my parent's pid is %d\n", getpid(), getppid()); } else { // putchar('c'); printf("I am C,My pid is %d, my parent's pid is %d\n", getpid(), getppid()); } } else { // putchar('b'); printf("I am B,My pid is %d, my parent's pid is %d\n", getpid(), getppid()); } } else { //putchar('a'); printf("I am A,My pid is %d\n", getpid()); } printf("\n"); getchar(); }
圖二
#include<stdio.h> #include<sys/types.h> /* 提供類型pid_t的定義 */ #include<unistd.h> /* 提供函數的定義 */ int main() { int p1_B,p1_C,p2_D,p2_E; while((p1_B=fork())== -1); if(p1_B==0) { printf("I am B,My pid is %d, my parent's pid is %d\n", getpid(), getppid()); while((p1_C=fork())== -1); if(p1_C==0) printf("I am C,My pid is %d, my parent's pid is %d\n", getpid(), getppid()); } else { printf("I am A,My pid is %d\n",getpid()); while((p2_D=fork())==-1); if(p2_D==0) { printf("I am D,My pid is %d, my parent's pid is %d\n", getpid(), getppid()); while((p2_E=fork())== -1); if(p2_E==0) printf("I am E,My pid is %d, my parent's pid is %d\n", getpid(), getppid()); } } getchar(); }