Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1798213
  • 博文数量: 335
  • 博客积分: 4690
  • 博客等级: 上校
  • 技术积分: 4341
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-08 21:38
个人简介

无聊之人--除了技术,还是技术,你懂得

文章分类

全部博文(335)

文章存档

2016年(29)

2015年(18)

2014年(7)

2013年(86)

2012年(90)

2011年(105)

分类: C/C++

2012-03-28 15:19:25


点击(此处)折叠或打开

  1. #include "apue.h"
  2. static void sig_pipe(int); /* our signal handler */
  3. int main(void)
  4. {
  5.     int n,fd1[2],fd2[2];
  6.     pid_t pid;
  7.     char line[MAXLINE];

  8.     if (signal(SIGPIPE,sig_pipe) == SIG_ERR)
  9.         err_sys("signal error ");
  10.     if ( pipe(fd1) < 0 || pipe(fd2) < 0)
  11.         err_sys("pipe error ");
  12.     if (( pid = fork() ) < 0) {
  13.         err_sys("fork error ");
  14.     } else if ( pid > 0) { /* parent */
  15.         close(fd1[0]);
  16.         close(fd2[1]);
  17.         while( fgets(line,MAXLINE,stdin) != NULL ){
  18.             n = strlen(line);
  19.             if (write(fd1[1],line,n) != n)
  20.                 err_sys("write error to pipe");
  21.             if (( n = read(fd2[0],line,MAXLINE)) < 0)
  22.                 err_sys("read error form pipe ");
  23.             if ( n == 0 ){
  24.                 err_msg("child closed pipe ");
  25.                 break;
  26.             }
  27.             line[n] = 0; /* null terminate */
  28.             if (fputs(line,stdout) == EOF )
  29.                 err_sys("fputs error");
  30.              break;
  31.         }
  32.         if (ferror(stdin))
  33.             err_sys("fgets error on stdin ");
  34.         exit(0);
  35.     }else { /* child */
  36.         close(fd1[1]);
  37.         close(fd2[0]);
  38.         if (fd1[0] != STDIN_FILENO) {
  39.             if (dup2(fd1[0],STDIN_FILENO) != STDIN_FILENO)
  40.                 err_sys("dup2 error to stdin");
  41.         close(fd1[0]);
  42.      }
  43.         if (fd2[1] != STDOUT_FILENO) {
  44.             if (dup2(fd2[1],STDOUT_FILENO) != STDOUT_FILENO)
  45.                 err_sys("dup2 error to stdout ");
  46.             close( fd2[1]);
  47.         }
  48.         if (execl("./add","add",(char *) 0) < 0)
  49.             err_sys("execl error");
  50.     }
  51.         exit(0);
  52. }
  53.     
  54.     static void
  55.         sig_pipe(int signo){
  56.             printf("sigpipe caught \n");
  57.             exit(1);
  58.         }

点击(此处)折叠或打开

  1. #include "apue.h"
  2. int
  3. main(void )
  4. {
  5.     int n ,int1,int2;
  6.     char line[MAXLINE];

  7.     while((n=read(STDIN_FILENO,line,MAXLINE)) > 0) {
  8.         line[n]=0; /* null terminate */
  9.         if (sscanf(line,"%d%d",&int1,&int2) == 2){
  10.             sprintf(line,"%d\n",int1+int2);
  11.             n=strlen(line);
  12.             if (write(STDOUT_FILENO,line,n) != n)
  13.                 err_sys("write error");
  14.         } else {
  15.             if (write(STDOUT_FILENO,"invalid args \n",13) != 13)
  16.                 err_sys("write error");
  17.         }
  18.     }
  19.     exit(0);
  20. }

output of process :
./c15-9 
2 4
6

./15-9 
然后打开一个新的终端
ps  aux 
kill add
在换回原终端
2 4
sigpipe caught 

通过使用两个管道来连接一个协同进程。
程序的流程如下:
                       fd1[0]
父进程               ---------------》 子进程
                      《------------ 
                       fd2[1]
父进程的标准输入和输出均被定向到了管道的两端,通过两个管道来实现















阅读(1446) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~