• 进程间通信之管道


    https://github.com/realingy/ipcs

    Linux中管道的一个应用实例

    cat test.txt | grep -E "TEST" | cut -d = -f 2

    前一条命令的输出作为后一条命令的输入,即实现了进程间的通信。

    管道的实现机制是实现两个进程分别读和写,以使得两者之间实现资源共享,共享的资源叫pipe文件。管道的特点是单向、先进先出、文件固定大小。写进程在管道的尾部写数据,读进程在管道的头部读数据。数据是一次性的,读数据就是取数据,数据被取走后管道中就不存在这段数据了。注意,读进程在写进程完成写数据之前,会阻塞运行,同理读进程在管道满的情况下试图写数据,写不成功就会阻塞。

    实例:无名管道实现父子进程之间的通信

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4 
     5 #define SIZE 256
     6 
     7 int main()
     8 {
     9   int processed=0;
    10   const char data[]="hello pipe!";
    11   char buff[SIZE];
    12   memset(buff,'',sizeof(buff));
    13   int fd[2];
    14   
    15   if(pipe(fd)==0) //管道创建成功
    16   {
    17     pid_t pid=fork();
    18     if(pid<0) //创建子进程失败
    19     {
    20       printf("fork failure!");
    21       exit(1);
    22     }
    23     if(pid==0)//子进程读取buffer中的数据
    24     {
    25       processed=read(fd[0],buff,SIZE);/*文件描述符fd[0]作为管道头部,读进程从此处读数据,
    26 最大读取长度为缓冲区的长度*/
    27       printf("read %d bytes:%s
    ",processed,buff);
    28       exit(0);
    29     }
    30     else //父进程向buffer中写数据
    31     {
    32       processed=write(fd[1],data,strlen(data));//文件描述符fd[1]作为管道尾部,写进程从此处写数据
    33       printf("write %d bytes:%s
    ",processed,data);
    34       exit(0);
    35     }
    36   }
    37   exit(1);
    38 }

    实例:实现两个子进程之间通信

     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define SIZE 256
     
    int main()
    {
       int processed=0;
       const char data[]="pipe between two processes!";
       char buff[SIZE];
       memset(buff,'',sizeof(buff));
       int fd[2];
       
       if(pipe(fd)==0) //管道创建成功
       {
        pid_t pid1
    =fork();
        if(pid1<0) //创建子进程p1失败

        {
          printf(
    "fork p1 failure!");
          exit(
    1);
        } 
        if(pid1==0)//子进程p1读取buffer中的数据     {       close(fd[1]);       processed=read(fd[0],buff,SIZE);/*文件描述符fd[0]作为管道头部,读进程从此处读数据, 最大读取长度为缓冲区的长度*/       printf("p1 read %d bytes:%s ",processed,buff);       exit(0);     }       
        pid_t pid2
    =fork();       if(pid2<0) //创建子进程p2失败

        {       printf("fork p2 failure!");       exit(1);     }     else //子进程p2向buffer中写数据     {       close(fd[0])       processed=write(fd[1],data,strlen(data));//文件描述符fd[1]作为管道尾部,写进程从此处写数据       printf("p2 write %d bytes:%s ",processed,data);       exit(0);     }   }   exit(1); }
  • 相关阅读:
    virtualbox centos安装增强工具和问题详解
    Failed to load SELinux policy. Freezing
    .net mvc项目本地调试:浏览器一直转圈无法访问
    System.Security.Cryptography.CryptographicException: 出现了内部错误
    【SymmetricDS】实现新的数据库方言
    【SymmetricDS】SymmetricDS是如何工作的
    【Java】java.util.Objects 源码学习
    【Spring-web】AsyncRestTemplate源码学习
    【Spring-web】RestTemplate源码学习——梳理内部实现过程
    【Spring-web】RestTemplate源码学习
  • 原文地址:https://www.cnblogs.com/ingy0923/p/8628018.html
Copyright © 2020-2023  润新知