进程间通信之管道

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); }
原文地址:https://www.cnblogs.com/ingy0923/p/8628018.html