zoukankan      html  css  js  c++  java
  • [置顶] Linux高编之进程--------fork函数的同步与异步(兄弟子进程和父子孙进程示列)

    前面讲述的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	pid=%d
    ",getpid(),getppid());
    			printf("This is the child
    ");
    			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
    ",WEXITSTATUS(stat_val));
    		else if(WIFSIGNALED(stat_val))
    			printf("Child terminated abnormally,signal %d
    ",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	pid=%d
    ",getpid(),getppid());
    			printf("This is the child
    ");
    			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
    ",WEXITSTATUS(stat_val));
    		else if(WIFSIGNALED(stat_val))
    			printf("Child terminated abnormally,signal %d
    ",WTERMSIG(stat_val));	
    		}
    	return 0;
    }


    用pstree观看如下:


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

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


                          

  • 相关阅读:
    WEB前端工程师 – 职业生涯规划
    求Sn=a+aa+aaa+…+aaa…a的值
    输入一行字符,分别统计出其中英文字母 空格 数字和其他字符的个数
    getchar()的用法!
    求1+2+…+n的和不大于1000的最大自然数n
    编程打印输出*金字塔
    从键盘输入一个整数,判断该数是否回文数.
    编程求"水仙花数"
    编程求出1000以内的完全数
    输入两个正整数,求它们的最大公约数和最小公倍数.
  • 原文地址:https://www.cnblogs.com/riskyer/p/3357929.html
Copyright © 2011-2022 走看看