编程实现父进程建立的两个子进程p1,p2利用pipe实现双向通信(p1发一条消息收一条消息,p2收一条发一条消息,或者相反;可用sleep控制同步),父进程等待子进程结束后输出通信结束信息终止
时间: 2024-11-27 18:09:19 浏览: 4
(修改版)进程的管道通信编制一段程序,实现进程的管道通信,使用系统调用pipe()建立一个管道文件;两个子进程P1和P2。
4星 · 用户满意度95%
在Linux系统下,可以使用`fork()`函数创建子进程,并通过`pipe()`函数创建管道来实现父进程和子进程之间的双向通信。以下是使用C语言的一个简单示例:
首先,我们假设有一个简单的消息结构体`msg_t`,它包含发送和接收的数据。然后,在父进程中:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
typedef struct {
char data[100];
} msg_t;
int main() {
int pipe_fd[2]; // 创建管道的两个描述符
pid_t p1, p2;
if (pipe(pipe_fd) < 0) {
perror("Pipe creation failed");
return -1;
}
// 创建第一个子进程p1
p1 = fork();
if (p1 == 0) { // 子进程p1部分
close(pipe_fd[0]); // 关闭读端
write(pipe_fd[1], "Message from p1", strlen("Message from p1"));
sleep(1); // 等待p2读取消息
printf("Sending finished in p1\n");
_exit(0);
} else if (p1 > 0) { // 父进程部分
close(pipe_fd[1]); // 关闭写端
// 接收并打印从p1收到的消息
read(pipe_fd[0], &msg_t, sizeof(msg_t));
printf("Received message: %s\n", msg_t.data);
// 创建第二个子进程p2
p2 = fork();
if (p2 == 0) { // 子进程p2部分
close(pipe_fd[1]); // 关闭父进程写入端
read(pipe_fd[0], &msg_t, sizeof(msg_t)); // 从p1读取消息
write(pipe_fd[0], "Reply from p2", strlen("Reply from p2")); // 发送回复
printf("Sending finished in p2\n");
_exit(0);
}
wait(NULL); // 等待p1和p2结束
printf("Communication ended.\n");
} else {
perror("Fork failed");
exit(-1);
}
return 0;
}
```
在这个例子中,子进程p1先向管道写入一条消息,然后让步给p2。p2读取p1的消息后,再向管道写入回复。最后,父进程等待子进程p1和p2结束,并输出通信结束的信息。
阅读全文