Linux进程间通信:管道和FIFO

本文介绍了Linux进程间通信的两种方式:管道(pipe)和FIFO(有名管道)。管道主要用于有亲缘关系的进程通信,通过pipe()函数创建,使用read()和write()进行数据交换。FIFO则允许无亲缘关系的进程通信,通过mkfifo()函数创建,同样使用read()和write()读写数据。文章通过实例展示了如何使用管道和FIFO进行进程间的双工通信。
摘要由CSDN通过智能技术生成

内容参考自:《Unix网络编程 卷2:进程间通信》

一、管道(pipe)

管道是最初的Unix IPC(interprocess communication, 进程间通信)形式。由于管道没有名字,只能用在有亲缘关系的进程间通信。

1、创建管道

linux为我们提供了pipe()函数来创建管道,函数定义如下:

#include <unistd.h>
int pipe(int pipefd[2]);

//示例:
int pipefd[2]
if(pipe(pipefd) < 0)
    printf("Filed to create pipe.");

man pages( 命令$ man pipe)的解释:pipe() 函数创建了一个用于IPC的通道,成功返回0,失败返回-1的同时 errno 会被设置。参数 pipefd 用于返回管道读写端的文件描述符。pipefd[0] 用于从管道中读数据;pipefd[1] 用于将写数据到管道中。系统内核会缓存着写入管道的数据数据,直到这些数据从管道的另一端被读出来。

2、数据接收和发送

read()函数和write()函数对管道进行读写。

//示例
int n;
char buff[1024];
//接收数据
n = read(pipefd[0], buff, MAXLINE)
//发送数据
write(pipefd[1], buff, strlen(buff));

3、例子

定义一个进程通信双方的任务作为例子:客户端从标准输入流中读取一个文件路径名,然后将这个文件路径发送给服务器;服务器读出文件内容,返回给客户端。为了实现二者双工通信且防止冲突,可以创建两个管道来完成父进程和子进程之间的通信。代码实现思路如下:

  • 使用pipe函数创建两个管道(pipe1、pipe2);
  • 将pipe1的写文件描述符和pipe2的读文件描述符交给父进程;
  • 将pipe1的读文件描述符和pipe2的写文件描述符交给子进程;
  • 父进程作为客户端将从标准输入流中获取的文件路径写入pipe1,然后从pipe2阻塞地读取数据;
  • 子进程作为服务器从pipe1阻塞地读取文件路径后,读取文件内容写入pipe2。

代码如下:

//pipe_test.c

#include <unistd.h>     //pipe STDOUT_FILENO open close
#include <sys/types.h>  //fork open
#include <fcntl.h>      //file controll open
#include <stdio.h>      //stdin fgets snptrintf
#include &
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值