LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖

[gcc] 可执行文件之间数据的非文件传递

[复制链接]
发表于 2003-8-9 22:44:57 | 显示全部楼层

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. #include <sys/wait.h>

  5. void err_sys(char *);

  6. int
  7. main(int argc, char *argv[])
  8. {
  9.   int fd1[2], fd2[2];
  10.   pid_t pid;
  11.   int n;
  12.   char buf[100];

  13.   if(pipe(fd1) < 0)    /* 两个半双工管道,[0]读、[1]写 */
  14.     err_sys("pipe(fd1) error");
  15.   if(pipe(fd2) < 0)
  16.     err_sys("pipe(fd2) error");

  17.   if((pid = fork()) < 0)
  18.     err_sys("fork error");
  19.   else if(pid == 0){   /* 子进程 */
  20.     if(fd1[0] != STDIN_FILENO)
  21.       dup2(fd1[0], STDIN_FILENO); /* 复制fd1[0]到标准读 */
  22.     if(fd2[1] != STDOUT_FILENO)
  23.       dup2(fd2[1], STDOUT_FILENO); /* 复制fd2[1]到标准写 */
  24.     close(fd1[1]); /* 关闭对应的读、写管道描述符 */
  25.     close(fd2[0]); /* 这里有问题,因为已经复制过管道描述符了, */
  26.                    /* 子进程只使用标准的读、写描述符, */
  27.                    /* 所以管道描述符已经不需要了,全部关闭或不关闭都可以 */
  28.     execl("./name", "name", (char *)0); /* 运行name */
  29.     err_sys("execl error");
  30.   }else{
  31.     close(fd2[1]); /* 关闭子进程使用的读、写管道描述符,留下对应的 */
  32.     close(fd1[0]); /* 比如子进程向fd2[1]写,父进程就从对应的fd2[0]读 */
  33.     printf("This is %s\n", argv[0]);
  34.     n = read(fd2[0], buf, 99); /* 读"What's your name?\n: " */
  35.     buf[n] = '\0';
  36.     printf(buf);
  37.     fgets(buf, 99, stdin);
  38.     write(fd1[1], buf, strlen(buf)); /* 写buf到子进程 */
  39.     n = read(fd2[0], buf, 99); /* 读"Your name is "%s".\n" */
  40.     buf[n] = '\0';
  41.     printf(buf);
  42.     wait(NULL); /* 等待子进程结束 */
  43.   }

  44.   exit(0);
  45. }

  46. void
  47. err_sys(char *s)
  48. {
  49.   perror(s);
  50.   exit(-1);
  51. }
复制代码
自由狼-台风 该用户已被删除
 楼主| 发表于 2003-8-11 16:19:17 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表