实验目的 实现一个管道通信程序 实验内容 由父进程创建一个管道,然后再创建3个子进程,并由这三个子进程用管道与父进程之间进行通信:子进程发送信息,父进程等三个子进程全部发完消息后再接收信息。通信的具体内容可根据自己的需要随意设计,要求能够实验阻塞型读写过程的各种情况,并要求实现进程间对管道的互斥访问。运行程序,观察各种情况下,进程实际读写的字节数以及进程阻塞唤醒情况。
时间: 2023-12-03 22:45:02 浏览: 119
这是一个比较典型的进程间通信的例子,可以使用C语言编写。以下是示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
#include <fcntl.h>
#define BUFFER_SIZE 32
int main()
{
int fd[2];
pid_t pid;
char buffer[BUFFER_SIZE];
// 创建管道
if (pipe(fd) == -1)
{
perror("pipe");
exit(EXIT_FAILURE);
}
// 创建3个子进程
for (int i = 0; i < 3; i++)
{
pid = fork();
if (pid == -1)
{
perror("fork");
exit(EXIT_FAILURE);
}
else if (pid == 0) // 子进程
{
// 关闭读端
close(fd[0]);
char *msg = "hello from child process\n";
write(fd[1], msg, strlen(msg));
exit(EXIT_SUCCESS);
}
}
// 关闭写端
close(fd[1]);
// 等待所有子进程发完消息
int status;
for (int i = 0; i < 3; i++)
{
wait(&status);
}
// 接收子进程发送的消息并打印
while (read(fd[0], buffer, BUFFER_SIZE) > 0)
{
printf("%s", buffer);
}
return 0;
}
```
在上面的代码中,首先创建了一个管道,并创建了3个子进程。每个子进程都向管道中写入了一条消息。父进程等待所有子进程写完消息后,再从管道中读取所有消息并打印。在这个过程中,由于管道是阻塞型的,因此可能会出现阻塞和唤醒的情况。
在上面的代码中,父进程关闭了管道的写端,这意味着在管道中写入数据时,如果所有的写端都已关闭,则会产生SIGPIPE信号,从而终止写入操作。另外,每个子进程都使用了exit函数来退出。这个函数会在进程退出时自动关闭该进程所有打开的文件描述符,包括管道的文件描述符。因此,在每个子进程中,我们不需要手动关闭管道的文件描述符。
阅读全文