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 }