linux父子进程共享一无名管道,两个子进程作为发送方分别向管道发送一行信息,父进程先读出子进程P1发来的信息行,将其转换为大写字母输出;再读出子进程P2发来的信息行,将其转换为小写字母输出。
时间: 2024-02-22 08:56:11 浏览: 97
下面是一个基于无名管道实现父子进程间通信的示例代码,其中包含了您提到的场景:
```cpp
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <ctype.h>
int main() {
int fds[2];
pid_t pid1, pid2;
char buf1[1024], buf2[1024];
// 创建无名管道
if (pipe(fds) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
pid1 = fork();
if (pid1 == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid1 == 0) {
// 子进程P1
close(fds[0]); // 关闭管道读端
// 向管道写入一行信息
write(fds[1], "Hello from P1\n", 14);
exit(EXIT_SUCCESS);
} else {
pid2 = fork();
if (pid2 == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid2 == 0) {
// 子进程P2
close(fds[0]); // 关闭管道读端
// 向管道写入一行信息
write(fds[1], "Hello from P2\n", 14);
exit(EXIT_SUCCESS);
} else {
// 父进程
close(fds[1]); // 关闭管道写端
wait(NULL); // 等待P1退出
wait(NULL); // 等待P2退出
// 从管道中读取P1发送的信息
read(fds[0], buf1, sizeof(buf1));
printf("Message from P1: %s", buf1);
// 将P1发送的信息转换为大写字母并输出
for (int i = 0; i < sizeof(buf1); i++) {
buf1[i] = toupper(buf1[i]);
}
printf("Upper message from P1: %s", buf1);
// 从管道中读取P2发送的信息
read(fds[0], buf2, sizeof(buf2));
printf("Message from P2: %s", buf2);
// 将P2发送的信息转换为小写字母并输出
for (int i = 0; i < sizeof(buf2); i++) {
buf2[i] = tolower(buf2[i]);
}
printf("Lower message from P2: %s", buf2);
// 关闭管道读端
close(fds[0]);
exit(EXIT_SUCCESS);
}
}
}
```
在此示例代码中,创建了一个无名管道,并在父进程中创建了两个子进程P1和P2,它们分别向管道中写入一行信息。父进程从管道中读取子进程P1发送的信息,并将其转换为大写字母输出;然后再从管道中读取子进程P2发送的信息,并将其转换为小写字母输出。最后,父进程关闭管道读端并退出。
阅读全文