管道
2019-03-25 本文已影响0人
静倚晴窗笑此生
man 7 PIPE
pipe和FIFO介绍
pipe匿名管道,只能用于有亲缘关系的进程间通信
FIFO命名管道,任意两个进程间通信
匿名管道
pipe
创建匿名管道,用于进程间通信,必须凑齐读写双方
函数声明
#include <unistd.h>
int pipe(int pipefd[2]);
参数含义
需要一个大小为2的整型一维数组首地址,回填两个文件描述符,pipefd[0]为读端,pipefd[1]为写端。
返回值
成功返回0失败-1
读管道
用read(2)读pipe(2)回填的读端文件描述符
写管道
用write(2)写pipe(2)回填的写端文件描述符
关闭管道
用close(2)关闭读写端两个文件描述符
注意:
lseek(2) 不能作用于管道
uname -r 查看内核版本
fcntl(2)可以用于设置管道容量,管道默认容量为4k
代码示例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#define BUFSIZE 1024
int main(void)
{
pid_t pid;
int pfd[2];
char buf[BUFSIZE] = {};
if (pipe(pfd) == -1)
{
perror("pipe()");
exit(1);
}
pid = fork();
if (pid == -1)
{
perror("fork()");
goto ERROR;
}
if (pid == 0)
{
close(pfd[0]);
write(pfd[1], "hello", 5);
close(pfd[1]);
exit(0);
}
close(pfd[1]);
read(pfd[0], buf, BUFSIZE);
puts(buf);
close(pfd[0]);
wait(NULL);
exit(0);
ERROR:
close(pfd[0]);
close(pfd[1]);
exit(1);
}
命名管道
存在的系统文件
在终端用mkfifo(1)命令创建
在程序中用mkfifo(3)函数创建