C编程实现进程间管道通信。要求:父子进程共享一无名管道,两个子进程作为发送方分别向管道发送一行信息,父进程先读出子进程P1发来的信息行,将其转换为大写字母输出;再读出子进程P2发来的信息行,将其转换为小写字母输出。
时间: 2023-12-30 16:02:57 浏览: 113
进程间通信-管道
以下是用C语言实现进程间管道通信的代码:
```c
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MSG_SIZE 256
int main() {
int pipe_fd[2];
pid_t pid1, pid2;
char msg[MSG_SIZE];
if (pipe(pipe_fd) < 0) {
perror("pipe");
exit(EXIT_FAILURE);
}
pid1 = fork();
if (pid1 < 0) {
perror("fork");
exit(EXIT_FAILURE);
}
if (pid1 == 0) {
// Child process P1
close(pipe_fd[0]); // Close unused read end
char *msg1 = "Hello, P2!";
write(pipe_fd[1], msg1, strlen(msg1));
exit(EXIT_SUCCESS);
} else {
pid2 = fork();
if (pid2 < 0) {
perror("fork");
exit(EXIT_FAILURE);
}
if (pid2 == 0) {
// Child process P2
close(pipe_fd[0]); // Close unused read end
char *msg2 = "Hello, P1!";
write(pipe_fd[1], msg2, strlen(msg2));
exit(EXIT_SUCCESS);
} else {
// Parent process
close(pipe_fd[1]); // Close unused write end
int n = read(pipe_fd[0], msg, MSG_SIZE);
if (n > 0) {
msg[n] = '\0';
for (int i = 0; i < n; i++) {
msg[i] = toupper(msg[i]);
}
printf("Parent received message from P1: %s\n", msg);
}
n = read(pipe_fd[0], msg, MSG_SIZE);
if (n > 0) {
msg[n] = '\0';
for (int i = 0; i < n; i++) {
msg[i] = tolower(msg[i]);
}
printf("Parent received message from P2: %s\n", msg);
}
wait(NULL);
wait(NULL);
exit(EXIT_SUCCESS);
}
}
}
```
在这个程序中,我们先创建了一个无名管道 `pipe_fd`,然后通过 `fork()` 函数创建了两个子进程 P1 和 P2。这两个子进程分别向管道中写入一行信息,父进程则从管道中读取信息,并将其转换为大写字母或小写字母输出。
需要注意的是,在父进程中我们需要等待两个子进程都结束后才退出程序,否则可能会出现僵尸进程。可以使用 `wait()` 函数等待子进程结束。
阅读全文