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


                          

  • 相关阅读:
    电子商务:不只是一个网站那么简单
    sqlserver中使用查询分析器的一点小技巧
    以成败论英雄
    SEO 工具集合
    网页中常用JAVASCRIPT技巧
    调用样式表(基础)
    【转载】fontsize:100%有什么作用
    Div+CSS常见错误
    css简单的总结
    【转载】网页尺寸规范
  • 原文地址:https://www.cnblogs.com/riskyer/p/3357929.html
Copyright © 2011-2022 走看看