您的位置:首页 > 运维架构 > Linux

Linux-进程间通信(一): 管道

2016-03-19 21:45 423 查看
1. 管道局限性:

(1) 半双工;(若模拟全双工,可以使用两个管道,即,proc1-->proc2一条管道,proc2-->proc1一条管道)

(2) 只能在具有公共祖先的进程之间使用;

2. 管道创建函数:

#include <unistd.h>

int pipe (int filedes[2]);

ret = 0-成功 -1-失败


经由filedes返回两个文件描述符:filedes[0]为读端,filedes[1]为写端;

3. 惯用方式:

由于单个进程中的管道并没有任何用户,所以,通常调用pipe的进程会接着调用fork,这样就创建了从父进程到子进程(或相反)的IPC通道;

比如为了创建从子进程到父进程的管道,子进程关闭读端fd[0],父进程关闭写端fd[1];

4. 一端关闭影响:

(1) 读一个写端已经被关闭的管道,数据被读取完毕后,会读到一个文件结束符,read返回0;

(2) 写一个读端已经被关闭的管道,会产生SIGPIPE信号;

5. 管道测试:从父进程向子进程传递数据

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LINE_SIZE 64

int main(int argc, char *argv[])
{
int n;
int fd[2];
pid_t pid;
char line[MAX_LINE_SIZE];

if (pipe(fd) < 0){
perror("pipe error");
return -1;
}

if ((pid = fork()) < 0){
perror("fork error");
return -1;
} else if (pid > 0){
close(fd[0]);
char * test_string = "hello world~\n";
write(fd[1], test_string, strlen(test_string));
wait(NULL);
close(fd[1]);
} else {
close(fd[1]);
n = read(fd[0], line, MAX_LINE_SIZE);
write(STDOUT_FILENO, line, n);
close(fd[0]);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: