1 #include "cmd_test.h"
2 #include <math.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <time.h>
7 #include <unistd.h>
8 
9 #define buf_SIZE 256 // 定义消息的最大长度
shell_pipe_test(int argc,char ** argv)10 int shell_pipe_test(int argc, char **argv)
11 {
12     int fd[2], i, n;
13 
14     pid_t pid;
15     int ret = pipe(fd); // 创建一个管道
16     if (ret < 0)
17     {
18         printf("pipe error");
19         exit(1);
20     }
21     pid = fork(); // 创建一个子进程
22     if (pid < 0)
23     {
24         printf("fork error");
25         exit(1);
26     }
27     if (pid == 0)
28     {                 // 子进程
29         close(fd[1]); // 关闭管道的写端
30         for (i = 0; i < 3; i++)
31         { // 循环三次
32             char buf[buf_SIZE] = {0};
33             n = read(fd[0], buf, buf_SIZE); // 从管道的读端读取一条消息
34             if (n > 0)
35             {
36 
37                 printf("Child process received message: %s\n", buf); // 打印收到的消息
38                 if (strcmp(buf, "quit") == 0)
39                 {                                     // 如果收到的消息是"quit"
40                     printf("Child process exits.\n"); // 打印退出信息
41                     break;                            // 跳出循环
42                 }
43                 else
44                 {                                                    // 如果收到的消息不是"quit"
45                     printf("Child process is doing something...\n"); // 模拟子进程做一些操作
46                     usleep(100);
47                 }
48             }
49         }
50         close(fd[0]); // 关闭管道的读端
51         exit(0);
52     }
53     else
54     {                 // 父进程
55         close(fd[0]); // 关闭管道的读端
56         for (i = 0; i < 3; i++)
57         { // 循环三次
58             char *msg = "hello world";
59             if (i == 1)
60             {
61                 msg = "how are you";
62                 usleep(1000);
63             }
64             if (i == 2)
65             {
66                 msg = "quit";
67                 usleep(1000);
68             }
69             n = strlen(msg);
70             printf("Parent process send:%s\n", msg);
71 
72             write(fd[1], msg, n); // 向管道的写端写入一条消息
73             if (strcmp(msg, "quit") == 0)
74             {                                      // 如果发送的消息是"quit"
75                 printf("Parent process exits.\n"); // 打印退出信息
76                 break;                             // 跳出循环
77             }
78         }
79         close(fd[1]); // 关闭管道的写端
80         wait(NULL);   // 等待子进程结束
81     }
82     return 0;
83 }