天天看點

linux父子程序的關系,Linux高編之過程-fork函數的同步與異步(兄弟子程序和父子孫程序示列)...

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觀察如下圖:

linux父子程式的關系,Linux高編之過程-fork函數的同步與異步(兄弟子程式和父子孫程式示列)...

可以看到有三個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觀看如下:

linux父子程式的關系,Linux高編之過程-fork函數的同步與異步(兄弟子程式和父子孫程式示列)...

可知他們之間是父子孫程序,是同步關系。

通過以上我們了解了fork函數同步與異步之間大的差異,又不正确的地方希望指正。。。。