zoukankan      html  css  js  c++  java
  • 进程间通信之管道

    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); }
  • 相关阅读:
    Encryption (hard) CodeForces
    cf 1163D Mysterious Code (字符串, dp)
    AC日记——大整数的因子 openjudge 1.6 13
    AC日记——计算2的N次方 openjudge 1.6 12
    Ac日记——大整数减法 openjudge 1.6 11
    AC日记——大整数加法 openjudge 1.6 10
    AC日记——组合数问题 落谷 P2822 noip2016day2T1
    AC日记——向量点积计算 openjudge 1.6 09
    AC日记——石头剪刀布 openjudge 1.6 08
    AC日记——有趣的跳跃 openjudge 1.6 07
  • 原文地址:https://www.cnblogs.com/ingy0923/p/8628018.html
Copyright © 2011-2022 走看看