文章目录
一、pipe 简介
pipe
也叫无名管道,有如下特点:
- 半双工,同一时刻数据只能一端操作
- 数据只能从一端写入,从另一端读出
- 存储在内存缓冲区,不存储在文件系统中,只能用于父子进程通信
- 数据一旦从管道中读走,就从管道中释放空间
二、pipe 代码示例
创建无名管道,其中 fd[0]
固定用于读管道,而 fd[1]
固定用于写管道
一般文件 I/O 的函数都可以用来操作管道( lseek()
除外)
默认情况当管道里没有数据时,另一个进程调用 read()
函数从管道中读数据是阻塞的
默认情况当管道里数据满时,另一个进程调用 write()
函数向管道里写数据也是阻塞的
通信过程中,当别的进程结束后,当前进程读端口也关闭后,则再向管道内写数据时进程会收到SIGPIPE
信号,默认动作为中断当前进程,不过编程时可通过 fcntl()
函数设置文件的阻塞特性
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
int fd_pipe[2] = {0};
pid_t pid;
pipe(fd_pipe);
pid = fork();
if (0 == pid)
{
sleep(2);
char buf[] = "hello world";
write(fd_pipe[1], buf, strlen(buf));
_exit(0);
}
else
{
fcntl(fd_pipe[0], F_SETFL, O_NONBLOCK); // 非阻塞
// fcntl(fd_pipe[0], F_SETFL, 0); // 阻塞
for (int i=0; i<5; i++)
{
char str[128] = {0};
read(fd_pipe[0], str, sizeof(str) ); //读数据
printf("str=[%s]\n", str);
sleep(1);
}
wait(NULL);
}
return 0;
}