由父进程创建一个管道,然后再创建3个子进程,并由这三个子进程用管道与父进程之间进行通信:子进程发送信息,父进程等三个子进程全部发完消息后再接收信息。通信的具体内容可根据自己的需要随意设计,要求能够实验阻塞型读写过程的各种情况,并要求实现进程间对管道的互斥访问。运行程序,观察各种情况下,进程实际读写的字节数以及进程阻塞唤醒情况。
时间: 2024-02-22 07:57:16 浏览: 55
好的,这是一个关于进程间通信的问题,需要使用管道和多进程编程的知识。下面是一份示例代码,实现了题目中的要求:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
#define MAX_BUF_SIZE 1024
int main() {
int pipefd[2];
pid_t pid[3];
char buf[MAX_BUF_SIZE];
int read_count = 0;
if (pipe(pipefd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
for (int i = 0; i < 3; i++) {
pid[i] = fork();
if (pid[i] == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid[i] == 0) { // 子进程
close(pipefd[0]); // 关闭管道读端
char msg[MAX_BUF_SIZE];
sprintf(msg, "Message from child process %d", i);
if (write(pipefd[1], msg, strlen(msg)) == -1) {
perror("write");
exit(EXIT_FAILURE);
}
printf("Child process %d send message to parent process\n", i);
close(pipefd[1]); // 关闭管道写端
exit(EXIT_SUCCESS);
}
}
close(pipefd[1]); // 关闭管道写端
while (read_count < 3) {
int nbytes = read(pipefd[0], buf, MAX_BUF_SIZE);
if (nbytes == -1) {
perror("read");
exit(EXIT_FAILURE);
} else if (nbytes == 0) {
printf("End of file\n");
break;
} else {
buf[nbytes] = '\0';
printf("Parent process receive message: %s\n", buf);
read_count++;
}
}
close(pipefd[0]); // 关闭管道读端
for (int i = 0; i < 3; i++) {
int status;
waitpid(pid[i], &status, 0);
}
return 0;
}
```
这份代码使用了 `pipe` 函数创建了一个管道,并使用 `fork` 函数创建了 3 个子进程。每个子进程都会往管道写入一条消息,然后关闭管道的写端。父进程会从管道读取 3 条消息,并打印出来。最后父进程会等待所有子进程结束。需要注意的是,为了保证进程间对管道的互斥访问,父进程和子进程都需要在读写管道时关闭不需要的管道端口。
你可以在自己的机器上编译运行这份代码,观察各种情况下进程实际读写的字节数以及进程阻塞唤醒情况。
阅读全文