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


                          

  • 相关阅读:
    python爬取北京政府信件信息03
    Python3.7 lxml引入etree
    python爬取北京政府信件信息02
    python爬取北京政府信件信息01
    2020.12.2收获
    2020.12.1收获
    2020.11.30收获
    2020.11.29收获
    2020.11.28收获
    2020.11.27收获
  • 原文地址:https://www.cnblogs.com/riskyer/p/3357929.html
Copyright © 2020-2023  润新知