前面讲述的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. JSONP技术原理及实现

    跨域问题一直是前端中常见的问题,每当说到跨域,第一浮现的技术必然就是JSONP JSONP在我的理解,它并不是ajax,它是在文档中插入一个script标签,创建_callback方法,通过服务器配合 ...

  2. 南理第八届校赛同步赛-F sequence//贪心算法&二分查找优化

    题目大意:求一个序列中不严格单调递增的子序列的最小数目(子序列之间没有交叉). 这题证明贪心法可行的时候,可以发现和求最长递减子序列的长度是同一个方法,只是思考的角度不同,具体证明并不是很清楚,这里就 ...

  3. c++预编译问题:fatal error C1083: Cannot open precompiled header file: 'Debug/DllTest.pch': No such file or d

    1)单独编译StdAfx.cpp 2)编译所有(即按Ctrl+F7) 这时因为该模块没有包括预编译头文件“stdafx.h”的缘故.VC用一个stdafx.cpp包含头文件stdafx.h,然后在st ...

  4. windows下node.js+sublime中安装coffeescript

    node.js中安装Coffeescript 1.我的node.js安装目录 2.node.js 全局模块所在目录   3.node.js安装coffeescript npm install -g c ...

  5. Jquery获取元素坐标

    获取页面某一元素的绝对X,Y坐标,相对于浏览器窗体,可以用offset()方法: var X = $('#DivID').offset().top; var Y = $('#DivID').offse ...

  6. 中国天气网接口返回json格式分析及接口(XML、图片接口)说明

    实时天气: city        "北京"//城市 cityid      "101010100"//城市编码 temp        "17&qu ...

  7. github避免每次输入账户密码

    方法1: 显示所有隐藏目录,找到目录./git下的文件config文件,通过文本方式打开,在最前面添加如下两行.之后再次输入一次密码后就会记住账号密码. [credential]     helper ...

  8. smali 语法之if语句

    # virtual methods .method public onClick(Landroid/view/View;)V .locals 3 .parameter "v" .p ...

  9. u-boot Makefile Source Test

    一.概述 笔者已经写了一篇实现目标文件与源码分开的makefile测试实验,但是觉得不够完美,没有更多的体现u-boot Makefile的工作原理和特点.所以,决定重新修订,使之更加充分的接近u-b ...

  10. keil对51单片机变量和函数的编译处理

    (1)初始值不是0的全局变量 在程序调到main()函数执行前,除了要进行内存清零.初始化堆栈外,还需要将全局变量的初始值加载到RAM的指定区域(编译过程中为全局变量分配的空间). (2)未初始化的局 ...