C编程实现进程间管道通信。要求:父子进程共享一无名管道,两个子进程作为发送方分别向管道发送一行信息,父进程先读出子进程P1发来的信息行,将其转换为大写字母输出;再读出子进程P2发来的信息行,将其转换为小写字
时间: 2024-02-03 12:15:57 浏览: 105
写字母输出。
下面是一个简单的 C 语言程序,实现了父子进程间的管道通信:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <ctype.h>
#define MESSAGE_SIZE 256
int main()
{
int fd[2];
char buf[MESSAGE_SIZE];
pid_t pid;
if (pipe(fd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (pid == 0) {
/* 子进程 P1 */
close(fd[0]);
char *msg = "Hello, I'm P1!";
write(fd[1], msg, strlen(msg));
close(fd[1]);
} else {
pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (pid == 0) {
/* 子进程 P2 */
close(fd[0]);
char *msg = "Hello, I'm P2!";
write(fd[1], msg, strlen(msg));
close(fd[1]);
} else {
/* 父进程 */
close(fd[1]);
/* 读取 P1 的信息 */
read(fd[0], buf, MESSAGE_SIZE);
printf("Received message from P1: %s\n", buf);
/* 转换为大写字母 */
for (int i = 0; i < strlen(buf); i++) {
buf[i] = toupper(buf[i]);
}
printf("Uppercase message: %s\n", buf);
/* 读取 P2 的信息 */
read(fd[0], buf, MESSAGE_SIZE);
printf("Received message from P2: %s\n", buf);
/* 转换为小写字母 */
for (int i = 0; i < strlen(buf); i++) {
buf[i] = tolower(buf[i]);
}
printf("Lowercase message: %s\n", buf);
close(fd[0]);
}
}
return 0;
}
```
在这个程序中,我们首先创建了一个无名管道,然后创建了两个子进程 P1 和 P2,它们分别向管道写入一行信息。父进程从管道中读取这两行信息,并将它们分别转换为大写和小写字母输出。
注意,我们在每个子进程中都关闭了管道的读端,这样就可以确保当子进程写完数据后,父进程才能读到数据。在父进程中,我们关闭了管道的写端,这样就可以确保只有子进程可以写入数据,父进程可以从管道中读取数据。
阅读全文