关于Linux C中的管道

pipe

pipe是匿名管道,其定义为int pipe(int filedes[2]);

其接收一个int类型的数组,若函数执行成功,数组的第零项是管道的读端,第一项是管道的写端

如果函数执行成功则返回0,否则返回-1

1
2
3
4
5
6
7
8
9
10
11
#include<unistd.h>
int fd[2];
int main()
{
int ret = pipe(fd);
if(ret < 0)
{
puts("fail to open pipe!");
exit(-1);
}
}

随后使用readwrite函数即可对管道进行读写

局限性:

  • 只能用于有亲缘关系的进程之中,例如fork出来的子进程
  • 没有名字
  • 管道的缓冲区有限

fifo

fifo是命名管道

创建它的函数为mkfifo,其定义为int mkfifo(const char * pathname, mode_t mode)

其接收两个参数,第一个为一个普通的路径名,即fifo的名字,第二个参数mode是fifo文件的访问权限

如果函数执行成功则返回0,否则返回-1

1
2
3
4
5
6
7
8
9
10
11
#include<sys/stat.h>
#include<sys/types.h>
int main()
{
int ret = mkfifo("/tmp/testfifo", O_RWDR);
if(ret < 0)
{
puts("fail to make fifo!");
exit(-1);
}
}

一旦fifo创建成功,任何进程都可以用平常对文件进行读写的方式使用它

然而,如果要发挥其管道的作用,在读端和写端两个进程中fifo文件必须都是打开的