Chinaunix首页 | 论坛 | 博客
  • 博客访问: 629933
  • 博文数量: 140
  • 博客积分: 2635
  • 博客等级: 少校
  • 技术积分: 1353
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-04 15:46
文章分类
文章存档

2015年(2)

2014年(12)

2013年(10)

2012年(10)

2011年(85)

2010年(21)

分类: LINUX

2014-06-26 13:16:37

管道是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) |
给主人留下些什么吧!~~