1、匿名管道pipe
匿名管道是半双工的,并且只能在具有公共祖先的两个进程之间使用。通常一个管道由一个进程创建,在进程调用fork之后,这个管道就能在父进程和子进程之间使用了。管道创建时会创建两个文件描述符,其中fd[0]为读而打开,fd[1]为写而打开。
#include "apue.h"
int main()
{
int n;
int fd[2];
pid_t pid;
char line[MAXLINE];
if (pipe(fd) < 0) {
err_sys("pipe error");
}
if ((pid = fork()) < 0) {
err_sys("fork error");
}
else if (pid > 0) {
close(fd[0]);
write(fd[1], "hello world\n", 12);
}
else {
close(fd[1]);
n = read(fd[0], line, MAXLINE);
write(STDOUT_FILENO, line, n);
}
exit(0);
}
2、命名管道FIFO
pipe只能在两个相关的进程之间使用,而命名管道FIFO则可以在两个不相关的进程之间使用,使用的范围更广。 使用FIFO时,首先需要使用mkfifo来创建它,创建之后,可以使用文件的相关函数open、read、write、close等函数像普通文件一样操作这个命名管道。
- 一般情况下,如果没有指定O_NONBLOCK,只读open要阻塞到某个其他进程为写而打开这个FIFO为止。类似的,只写open要阻塞到某个进程为读而打开它为止。如果指定了O_NONBLOCK,则只读open立即返回。但是,如果没有进程为读而打开一个FIFO,那么open将返回-1,并将errno设置为ENXIO。
- 若write一个尚无进程为读而打开的FIFO,则产生信号SIGPIPE,若某个FIFO的最后一个写进程关闭了该FIFO,则将为该FIFO的读进程产生一个文件结束标志。
从FIFO读数据的进程:
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h

最低0.47元/天 解锁文章
604

被折叠的 条评论
为什么被折叠?



