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观察如下图:

103810580.jpg

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

103810581.jpg

可知他们之间是父子孙进程,是同步关系。

通过以上我们了解了fork函数同步与异步之间大的差异,又不正确的地方希望指正。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值