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函数同步与异步之间大的差异,又不正确的地方希望指正。。。。


                          

  • 相关阅读:
    虚拟机中对centOS7.4配置静态ip
    mybatis使用中出现的错误!
    http中get和post方法区别
    java中堆和栈的区别
    struts2工作流程
    springmvc工作流程
    JDBC访问数据库流程
    并行程序设计模式-Master-Worker模式-Guarded Suspension模式-不变模式-生产者-消费者模式的理解
    Future模式个人理解
    分布式系统一致性问题和Raft一致性算法
  • 原文地址:https://www.cnblogs.com/riskyer/p/3357929.html
Copyright © 2011-2022 走看看