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,'\0',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\n",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\n",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,'\0',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\n",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\n",processed,data); exit(0); } } exit(1); }