管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别。
有名管道叫named pipe或者FIFO(先进先出),可以用函数mkfifo()创建。
Stream 的管道:是一个双向(全双共)管道。单个STREAMS管道就是能向父、子进程提供双向的数据流。
#define MAXLINE 20
3 #include
4 #include
5 #include
6 #include
7 #include
8 static void sig_pipe(int );
9 int s_pipe(int fd[2])
10 {
11 return (pipe(fd));
12 }
13 int main (void){
14 int n;
15 int fd[2];
16 pid_t pid;
17 char line[MAXLINE];
18 if (signal(SIGPIPE, sig_pipe) == SIG_ERR)
19 return -1;
20
21 if (s_pipe(fd) < 0)
22 return -1;
23 if ((pid = fork()) < 0) {
24 return 0 ;
25 } else if (pid > 0){
26 close(fd[1]);
27 while (fgets(line,MAXLINE,stdin) != NULL) {
28 n = strlen (line);
29 if (write(fd[0],line, n) != n)
30 return ("write error to pipe");
31 if ((n = read (fd[0], line, MAXLINE)) < 0)
32 return ("read error from pipe");
33 if (n == 0 ) {
34 return ("child closed pipe");
35 }
36 }
37 if (ferror(stdin))
38 return ("fgets error on stdin");
39 } else{
40 close(fd[0]);
41 if (fd[1] != STDIN_FILENO && dup2(fd[1],STDIN_FILENO) != STDIN_FILENO)
42 return ("dup2 error to stdin");
43 if (fd[1] != STDOUT_FILENO && dup2(fd[1],STDOUT_FILENO) != STDOUT_FILENO)
44 return ("dup2 error to stdout");
45 if (execl("./add2", "add2", (char *)0) < 0)
46 return ("execl error");
47 }
48
49 }
50 static void sig_pipe(int signo)
51 {
52 printf("SIGPIPE caught\n");
53 exit(1);
54 }
55
55,0-1 底端
阅读(1040) | 评论(0) | 转发(0) |