编写一个管道程序,由父进程创建一个管道,然后再创建 3 个子进程, 并由这三个子进程利用管道与父进程之间进行通信:子进程发送随机长度的信息 内容给父进程,父进程等三个子进程全部发完消息后再接收信息,以及Linux最后编译语句
时间: 2024-02-18 19:03:33 浏览: 70
好的,我会回答您的问题。下面是一个实现您要求的管道程序的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
#define MSG_SIZE 50 // 定义消息的最大长度
int main() {
int fd[2]; // 管道文件描述符
pid_t pid[3]; // 子进程 ID
int status; // 子进程退出状态
int i;
srand(time(NULL)); // 随机数种子
if (pipe(fd) < 0) { // 创建管道
perror("pipe");
exit(1);
}
for (i = 0; i < 3; i++) { // 创建 3 个子进程
pid[i] = fork();
if (pid[i] < 0) {
perror("fork");
exit(1);
} else if (pid[i] == 0) { // 子进程
close(fd[0]); // 关闭管道的读端
char msg[MSG_SIZE];
int len = rand() % MSG_SIZE; // 随机生成消息长度
int j;
for (j = 0; j < len; j++) { // 随机生成消息内容
msg[j] = 'A' + rand() % 26;
}
msg[len] = '\0'; // 字符串结束符
printf("Child %d sends message: %s\n", i, msg);
write(fd[1], msg, strlen(msg) + 1); // 发送消息
exit(0);
}
}
// 父进程
close(fd[1]); // 关闭管道的写端
for (i = 0; i < 3; i++) { // 等待 3 个子进程全部发完消息
waitpid(pid[i], &status, 0);
}
char recv_msg[MSG_SIZE];
int total_len = 0;
while (read(fd[0], recv_msg + total_len, MSG_SIZE - total_len) > 0) { // 接收消息
total_len = strlen(recv_msg) + 1;
}
printf("Parent receives message: %s\n", recv_msg);
return 0;
}
```
您可以将上面的代码保存到一个名为 `pipe.c` 的文件中,然后使用以下命令编译:
```
gcc pipe.c -o pipe
```
这将生成一个名为 `pipe` 的可执行文件。您可以运行它来测试管道程序的运行结果。
注意:由于随机数种子使用了当前时间,因此每次运行结果可能会不同。
阅读全文