习题:
使用管道实现父子进程间通信,完成:ls | wc –l。假定父进程实现ls,子进程实现wc。
ls命令正常会将结果集写出到stdout,但现在会写入管道的写端;wc –l 正常应该从stdin读取数据,但此时会从管道的读端读。
程序不时的会出现先打印 提 示符,再出程序运行结果的现象。 这是因为:父进程执行ls命令,将输出结果给通过管道传递给 子进程去执行wc命令,这时父进程若先于子进程打印wc运行结果 之前被shell使用wait函数成功回收,shell就会先于子进程打印 wc运行结果之前打印$提示符。 解决方法:让子进程执行ls,父进程执行wc命令。或者在兄弟进程间完成。
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <sys/wait.h>
4 #include <stdlib.h>
5 #include <fcntl.h>
6 #include <errno.h>
7
8 int main(void)
9 {
10 int ret;
11 pid_t pid;
12 int fd[2];
13 #if 1
14 if ( -1 == (ret=pipe(fd) ) )
15 {
16 perror("pipe faile:");
17 exit(1);
18 }
19 #endif
20 pid = fork();
21
22 //子进程 写
23 if(0 == pid)
24 {
25 close(fd[0]);
26 dup2(fd[1],STDOUT_FILENO);
27 execlp("ls","ls",NULL);
28
29 }
30
31 //父进程 读
32 else
33 {
34 close(fd[1]);
35 dup2(fd[0],STDIN_FILENO);
36 execlp("wc","wc",NULL);
37
38 }
39 printf("1\n");
60 return 0;
61 }