码迷,mamicode.com
首页 > 系统相关 > 详细

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

时间:2016-03-19 22:58:17      阅读:308      评论:0      收藏:0      [点我收藏+]

标签:

1. 管道局限性:

(1) 半双工;

(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. 管道测试:从父进程向子进程传递数据

 1 #include <unistd.h>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <string.h>
 5 
 6 #define MAX_LINE_SIZE 64
 7 
 8 int main(int argc, char *argv[])
 9 {
10     int n;
11     int fd[2];
12     pid_t pid;
13     char line[MAX_LINE_SIZE];
14 
15     if (pipe(fd) < 0){
16         perror("pipe error");
17         return -1;
18     }
19 
20     if ((pid = fork()) < 0){
21         perror("fork error");
22         return -1;
23     } else if (pid > 0){
24         close(fd[0]);
25         char * test_string = "hello world~\n";
26         write(fd[1], test_string, strlen(test_string));
27         wait(NULL);
28         close(fd[1]);
29     } else {
30         close(fd[1]);
31         n = read(fd[0], line, MAX_LINE_SIZE);
32         write(STDOUT_FILENO, line, n);
33         close(fd[0]);
34     }
35 
36     return 0;
37 }

 

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

标签:

原文地址:http://www.cnblogs.com/wanpengcoder/p/5294137.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!