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


                          

  • 相关阅读:
    Qt中QString,int,char,QByteArray之间相互转换
    Qt中的多线程编程
    在Qt中使用sleep(包含为win and *nix下sleep函数的实现及用法)
    Qt Creator 快捷键
    基于FFmpeg和Qt的播放器 QtAV库
    Ubuntu下APACHE HTTPS安装和配置
    很受欢迎的Linux笔记(短小精悍)
    QT基本使用
    FLV封装格式及分析器工具
    AVPicture、AVFrame和AVPacket
  • 原文地址:https://www.cnblogs.com/riskyer/p/3357929.html
Copyright © 2020-2023  润新知