前面讲述的fork函数的基本用法,下面通过两个程序来说明fork函数同步与异步之间的关系:

<1>通过fork函数实现在父进程下的四个兄弟子进程(即异步) :

函数实现代码:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/wait.h> 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 <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/wait.h> 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函数同步与异步之间大的差异,又不正确的地方希望指正。。。。

[置顶] Linux高编之进程--------fork函数的同步与异步(兄弟子进程和父子孙进程示列)的更多相关文章

  1. [置顶] linux中fork()函数详解(原创!!实例讲解)

    分类: 计算机系统 linux2010-06-01 23:35 60721人阅读 评论(105) 收藏 举报 linux2010存储  一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源 ...

  2. [置顶] Linux信号相关笔记

    最近又温习了一遍Linux中的信号知识,发现有很多东西以前没有注意到,就通过这篇博客记录一下,巩固一下知识点. 一,信号基础: 信号是什么?为了回答这个问题,首先要从异常说起,这里的异常不是指c++/ ...

  3. [置顶] Linux学习总结(20)——Linux 文件夹结构和作用

     /bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的基点,比如用户user的主目录就是/home/us ...

  4. [置顶] linux getline()函数

    getline()函数是什么?百度百科这样解释:      getline不是C库函数,而是C++库函数.它会生成一个包含一串从输入流读入的字符的字符串,直到以下情况发生会导致生成的此字符串结束.1) ...

  5. linux源码阅读笔记 fork函数

    在阅读源码的过程中,发现找不到fork函数的定义.后来在linux/init/main.c中找到了这样一条语句 static inline _syscall0(int,fork) 原来这里就是fork ...

  6. C语言 进程控制---创建进程fork()函数

    #include "sys/types.h" #include "stdio.h" #include "stdlib.h" #include ...

  7. [置顶] linux内核启动2-setup_arch中的内存初始化(目前分析高端内存)

    上一篇微博留下了这几个函数,现在我们来分析它们         sanity_check_meminfo();         arm_memblock_init(&meminfo, mdes ...

  8. [置顶] linux常用命令大全

    SSH 密令控制台 user/pwd 一:停止tomcat 1,cd .. 进入根目录 2,cd home/ 3,ll 4,cd bin/ 进入tomcat bin目录 5,ll 6,ps -ef | ...

  9. [置顶] Linux 常用命令集锦

    出处:http://www.vaikan.com/what-are-the-most-useful-swiss-army-knife-one-liners-on-unix/ Linux命令行里的&qu ...

随机推荐

  1. 来讲讲C#中的类

    1.什么是类? 面向对象的语言,最基本的就是类.在C#中,类是这样来定义的:类代表一组具有公共属性和行为的对象. 举个例子,现实生活中,人就是一个“类”,但这只是一个统称,指所有的人.我们要找个人一起 ...

  2. Ubuntu 13.04 配置Cocos2d-x记录

    装备工作: 下载JavaJDK  http://www.oracle.com/technetwork/java/javase/downloads/index.html 下载NDKhttp://deve ...

  3. ACM YTU 挑战编程 字符串 Problem A: WERTYU

    Problem A: WERTYU Description A common typing error is to place yourhands on the keyboard one row to ...

  4. 制作Net程序的帮助文档--总结

    一.工具的准备 目前,一般采用Sandcastle Help File Builder工具来制作.Net程序帮助文档,该工具主要是利用Xml文档里的信息以及DLL文件来生成完整的帮助文档.在Visua ...

  5. VC++ 17、18课

    进程间通信的四种方式: 剪贴板 匿名管道 命名管道 邮槽 容器和服务器程序 容器应用程序是可以嵌入或链接对象的应用程序.word就是容器应用程序. 服务器应用程序是创建对象并且当对象呗双击时,可以被启 ...

  6. Git (2)

    要使用Git首先遇到的问题是怎么把文件加到库中. 很简单. 新建一个目录,然后git init. 完成上述工作之后的唯一改动是在当前目录下生成了一个.git的子目录.这个子目录是一个集中的数据库,包含 ...

  7. php hook example

    http://www.thinkphp.cn/code/337.html http://blog.micxp.com/index.php/archives/63/

  8. preg_replace($pattern, $replacement, $content) 修饰符的奇葩作用

    $str = "<span>lin</span> == <span>3615</span>";$pattern = "/& ...

  9. apache2.4配置虚拟主机

    step1 启用 httpd-vhosts.conf 找到E:/apache/Apache24/conf 中httpd.conf 文件,取消注释下面这句话 step2 在 httpd-vhosts.c ...

  10. odoo8 email

    ?? return 地址和 from 地址不一致,为什么不能发送成功? replay地址. 根据对象(比如purchase.order)发送邮件,可以通过supermessage_get_email_ ...