、P1,P2,P3三个进程,P1和P2负责从键盘接收字符串,均发送给P3,P3接收到字符串,根据发送方分别显示”P3 received *** from P1(或P2)" ;用管道通信通信方式实现。
时间: 2024-05-10 12:19:37 浏览: 126
以下是基于Linux操作系统的C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#define BUFFER_SIZE 256
int main(void) {
int fd1[2], fd2[2];
pid_t pid;
if (pipe(fd1) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
if (pipe(fd2) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (pid == 0) { // P3
char buffer[BUFFER_SIZE];
close(fd1[1]);
close(fd2[1]);
while (1) {
ssize_t numBytes = read(fd1[0], buffer, BUFFER_SIZE);
if (numBytes == -1) {
perror("read");
exit(EXIT_FAILURE);
}
else if (numBytes == 0) {
printf("P3: End of file\n");
exit(EXIT_SUCCESS);
}
else {
if (strncmp(buffer, "QUIT", 4) == 0) {
printf("P3: Quitting...\n");
exit(EXIT_SUCCESS);
}
else if (strncmp(buffer, "P1", 2) == 0) {
printf("P3 received %s from P1\n", buffer + 3);
}
else if (strncmp(buffer, "P2", 2) == 0) {
printf("P3 received %s from P2\n", buffer + 3);
}
}
}
}
else { // P1 and P2
close(fd1[0]);
close(fd2[0]);
while (1) {
char buffer[BUFFER_SIZE];
printf("Enter a message: ");
fgets(buffer, BUFFER_SIZE, stdin);
if (strncmp(buffer, "QUIT", 4) == 0) {
printf("Quitting...\n");
write(fd1[1], "QUIT", 4);
write(fd2[1], "QUIT", 4);
break;
}
else {
write(fd1[1], "P1 ", 3);
write(fd1[1], buffer, strlen(buffer));
write(fd2[1], "P2 ", 3);
write(fd2[1], buffer, strlen(buffer));
}
}
wait(NULL);
exit(EXIT_SUCCESS);
}
return 0;
}
```
在上述代码中,我们创建了两个管道 `fd1` 和 `fd2`,分别用于P1和P2向P3发送消息。接着,我们使用 `fork()` 创建了一个新的进程P3。在P3中,我们通过不断循环从 `fd1` 接收P1发送的消息和从 `fd2` 接收P2发送的消息。根据接收到的消息,我们打印相应的信息,包括发送方和消息内容。
在P1和P2中,我们使用 `fgets()` 从键盘读取字符串,然后通过写入 `fd1` 和 `fd2` 发送给P3。如果输入的字符串是 "QUIT",我们就退出程序并发送 "QUIT" 给P3。最后,我们等待P3结束并退出程序。
这样,我们就实现了一个基于管道通信的多进程程序。
阅读全文