Linux下C编程,进程通信之无名管道通信

时间:2022-08-28 21:57:18

最近在看进程间的通信,下面说说管道通信之无名管道。

1.概述

  管道是Linux中很重要的一种通信方式,他是把一个程序的输出直接连接到另一个程序的输入,并且管道具有队列的特性。如Linux命令,“ps -ef | grep root”。如下图所示:

Linux下C编程,进程通信之无名管道通信

2.无名管道

  2.1特点

  (1)它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间)。
  (2)它是一个半双工的通信模式,具有固定的读端和写端。
  (3)管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。

  2.2主要函数说明

  int pipe(int fd[2])

    传入参数fd[2]数组,管道的两个文件描述符,之后就可以直接操作这两个文件描述符。其中fd[0]是“读”描述符,fd[1]是“写”描述符。

  2.3使用代码及说明

#include <unistd.h>
#include
<sys/types.h>
#include
<errno.h>
#include
<stdio.h>
#include
<stdlib.h>
#include
<string.h>
int main()
{
int pipe_fd[2];  /*用于保存两个文件描述符*/
pid_t pid;
char buf_r[100];  /*用于读数据的缓存*/
int r_num;  /*用于保存读入数据大数量*/ memset(buf_r,0,sizeof(buf_r));

if(pipe(pipe_fd)<0) /*创建管道,成功返回0,否则返回-1*/
return -1;

/*fork()创建一子进程,
   具体使用可以参见:http://www.cnblogs.com/xudong-bupt/archive/2013/03/26/2982029.html
*/
if((pid=fork())==0)
{
close(pipe_fd[
1]); /*关闭子进程写描述符,并通过使父进程暂停 2 秒确保父进程已关闭相应的读描述符*/
sleep(
2);
if((r_num=read(pipe_fd[0],buf_r,100))>0) /*子进程读取管道内容*/
printf(
"%d numbers read from the pipe is %s\n",r_num,buf_r);
close(pipe_fd[
0]);/*关闭子进程读描述符*/
exit(
0);
}

else if(pid>0)
{
close(pipe_fd[
0]);/*/关闭父进程读描述符,并分两次向管道中写入 Hello Pipe*/
if(write(pipe_fd[1],"Hello",5)!= -1)
printf(
"parent write1 success!\n");
if(write(pipe_fd[1]," Pipe",5)!= -1)
printf(
"parent write2 success!\n");
close(pipe_fd[
1]);/*关闭父进程写描述符*/
sleep(
3);
exit(
0);
}
}