|
发表于 2003-8-9 22:44:57
|
显示全部楼层
- #include <stdio.h>
- #include <sys/types.h>
- #include <unistd.h>
- #include <sys/wait.h>
- void err_sys(char *);
- int
- main(int argc, char *argv[])
- {
- int fd1[2], fd2[2];
- pid_t pid;
- int n;
- char buf[100];
- if(pipe(fd1) < 0) /* 两个半双工管道,[0]读、[1]写 */
- err_sys("pipe(fd1) error");
- if(pipe(fd2) < 0)
- err_sys("pipe(fd2) error");
- if((pid = fork()) < 0)
- err_sys("fork error");
- else if(pid == 0){ /* 子进程 */
- if(fd1[0] != STDIN_FILENO)
- dup2(fd1[0], STDIN_FILENO); /* 复制fd1[0]到标准读 */
- if(fd2[1] != STDOUT_FILENO)
- dup2(fd2[1], STDOUT_FILENO); /* 复制fd2[1]到标准写 */
- close(fd1[1]); /* 关闭对应的读、写管道描述符 */
- close(fd2[0]); /* 这里有问题,因为已经复制过管道描述符了, */
- /* 子进程只使用标准的读、写描述符, */
- /* 所以管道描述符已经不需要了,全部关闭或不关闭都可以 */
- execl("./name", "name", (char *)0); /* 运行name */
- err_sys("execl error");
- }else{
- close(fd2[1]); /* 关闭子进程使用的读、写管道描述符,留下对应的 */
- close(fd1[0]); /* 比如子进程向fd2[1]写,父进程就从对应的fd2[0]读 */
- printf("This is %s\n", argv[0]);
- n = read(fd2[0], buf, 99); /* 读"What's your name?\n: " */
- buf[n] = '\0';
- printf(buf);
- fgets(buf, 99, stdin);
- write(fd1[1], buf, strlen(buf)); /* 写buf到子进程 */
- n = read(fd2[0], buf, 99); /* 读"Your name is "%s".\n" */
- buf[n] = '\0';
- printf(buf);
- wait(NULL); /* 等待子进程结束 */
- }
- exit(0);
- }
- void
- err_sys(char *s)
- {
- perror(s);
- exit(-1);
- }
复制代码 |
|