编程实现进程间管道通信。 要求:父子进程共享一无名管道,两个子进程作为发送方分别向管道发送一行信息,父进程先读出子进程P1发来的信息行,将其转换为大写字母输出;再读出子进程P2发来的信息行,将其转换为小写字母输出
时间: 2023-12-19 08:04:41 浏览: 101
下面是一个简单的 C 语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <ctype.h>
#define BUFFER_SIZE 256
int main() {
int fd[2];
pid_t pid1, pid2;
char buffer[BUFFER_SIZE];
// 创建无名管道
if (pipe(fd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
// 创建子进程 P1
pid1 = fork();
if (pid1 == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid1 == 0) {
// P1 发送信息到管道
close(fd[0]);
char *msg = "HELLO FROM P1";
write(fd[1], msg, strlen(msg) + 1);
exit(EXIT_SUCCESS);
}
// 创建子进程 P2
pid2 = fork();
if (pid2 == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid2 == 0) {
// P2 发送信息到管道
close(fd[0]);
char *msg = "world from p2";
write(fd[1], msg, strlen(msg) + 1);
exit(EXIT_SUCCESS);
}
// 父进程从管道读取信息并处理
close(fd[1]);
read(fd[0], buffer, BUFFER_SIZE);
// 转换为大写字母并输出
for (int i = 0; i < strlen(buffer); i++) {
buffer[i] = toupper(buffer[i]);
}
printf("P1: %s\n", buffer);
// 再次从管道读取信息并处理
read(fd[0], buffer, BUFFER_SIZE);
// 转换为小写字母并输出
for (int i = 0; i < strlen(buffer); i++) {
buffer[i] = tolower(buffer[i]);
}
printf("P2: %s\n", buffer);
return 0;
}
```
首先,我们创建一个长度为 256 的字符数组作为缓冲区,用于从管道中读取信息。然后,我们使用 `pipe` 函数创建一个无名管道。接下来,我们创建两个子进程 P1 和 P2,它们分别向管道发送一行信息。
在父进程中,首先关闭管道的写端,然后从管道中读取 P1 发来的信息,并将其转换为大写字母输出。接着,我们再次从管道中读取 P2 发来的信息,并将其转换为小写字母输出。
最后,我们关闭管道的读端并退出程序。
阅读全文