管道是UNIX系统IPC的最古老的形式。她有两种局限性:
1:半双工 2:只能在具有公共祖先的进程之间使用
管道是由pipe函数创建的:
#include
int pipe(int filedes[2]); //成功返回0,失败返回-1
filedes[0] : 为读而打开 filedes[1] :为写而打开
可以想象一下:管道就像一个爸爸和儿子之间玩游戏时的通道,爸爸进入通道找儿子,儿子从通道跑出来躲爸爸。
1:当管道写端被关闭后, 所有数据被读取后,read返回0 表示文件结束
2:当管道读端被关闭后, 写数据时则产生信号SIGPIPE, write返回-1,errno 设置为 EPIPE.
管道在内核空间中创建, PIPE_BUF 规定内核中管道缓冲区的大小。
例:
- #include <stdio.h>
-
#include <unistd.h>
-
-
#define MAXLINE 128
-
-
int
-
main(void)
-
{
-
int n;
-
int fd[2];
-
pid_t pid;
-
char line[MAXLINE];
-
-
if (pipe(fd) < 0) {
-
printf("pipe error\n");
-
}
-
if ((pid = fork()) < 0) {
-
printf("fork error\n");
-
} 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);
-
}
-
-
return 0;
-
}
注:fork 函数被调用一次, 但返回两次。子进程返回0,父进程返回新子进程的ID。
阅读(829) | 评论(0) | 转发(0) |