Linux高編之程序--------fork函數的同步與異步(兄弟子程序和父子孫程序示列)
前面講述的fork函數的基本用法,下面通過兩個程式來說明fork函數同步與異步之間的關系:
<1>通過fork函數實作在父程序下的四個兄弟子程序(即異步) :
函數實作代碼:
#include
#include
#include
#include
#include
int main (void)
{
pid_t pid;
char *message;
int i;
for(i=0;i<3;i++){
pid=fork();
if(pid==0)break;
}
if(pid<0){
perror("fork failed");
exit(1);
}
if(pid==0){
int i;
for(i=5;i>0;i--){
printf("pid=%d\tpid=%d\n",getpid(),getppid());
printf("This is the child\n");
sleep(1);
while(1);
}
exit(3);
}
else{
int stat_val;
waitpid(pid,&stat_val,0);
//wait(&stat_val);
if(WIFEXITED(stat_val))
printf("Child exited with code %d\n",WEXITSTATUS(stat_val));
else if(WIFSIGNALED(stat_val))
printf("Child terminated abnormally,signal %d\n",WTERMSIG(stat_val));
}
return 0;
}
用工具pstree觀察如下圖:
可以看到有三個a.out并列,即他們直接屬于兄弟程序。
<2>通過fork函數實作在父程序下的父子孫程序(即同步):
函數代碼如下:
#include
#include
#include
#include
#include
int main (void)
{
pid_t pid;
char *message;
int i;
for(i=0;i<3;i++){
pid=fork();
if(pid>0)break;
}
if(pid<0){
perror("fork failed");
exit(1);
}
if(pid==0){
int i;
for(i=5;i>0;i--){
printf("pid=%d\tpid=%d\n",getpid(),getppid());
printf("This is the child\n");
sleep(1);
//while(1);
}
exit(3);
}
else{
int stat_val;
waitpid(pid,&stat_val,0);
//wait(&stat_val);
if(WIFEXITED(stat_val))
printf("Child exited with code %d\n",WEXITSTATUS(stat_val));
else if(WIFSIGNALED(stat_val))
printf("Child terminated abnormally,signal %d\n",WTERMSIG(stat_val));
}
return 0;
}
用pstree觀看如下:
可知他們之間是父子孫程序,是同步關系。
通過以上我們了解了fork函數同步與異步之間大的差異,又不正确的地方希望指正。。。。