① 编写一个程序os_exp4.c,建立一个管道。父进程生成两个子进程,p1和p2,两个子进程分别向管道中写入各自的字符串,父进程读出它们。(p1写:child process P1,p2写:child process P2)
时间: 2024-11-12 18:39:54 浏览: 21
OS_exp7.rar_OPT
为了创建一个程序`os_exp4.c`,首先需要了解几个关键点:管道(pipe)、父子进程通信以及 fork() 和 write()、read() 函数的使用。下面是一个简单的 C 语言示例,展示了如何在 Linux 环境下使用管道实现这个功能:
```c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#define BUFFER_SIZE 256
int main(void) {
// 创建管道
int pipefd[2];
if (pipe(pipefd) == -1) {
perror("Failed to create pipe");
exit(EXIT_FAILURE);
}
pid_t p1, p2;
// 父进程 fork
if ((p1 = fork()) == -1) {
perror("Failed to fork P1");
exit(EXIT_FAILURE);
}
if (p1 == 0) { // 子进程 p1
close(pipefd[1]); // 管道写端关闭,只允许从管道读取
char str[] = "child process P1";
write(pipefd[0], str, strlen(str) + 1); // 向管道写入数据
printf("P1 wrote to pipe and exiting\n");
exit(0);
} else if ((p2 = fork()) == -1) { // 父进程 fork 再次
perror("Failed to fork P2");
wait(NULL);
exit(EXIT_FAILURE);
} else if (p2 == 0) { // 子进程 p2
close(pipefd[0]); // 管道读端关闭,只允许从管道写入
char str[] = "child process P2";
write(pipefd[1], str, strlen(str) + 1); // 向管道写入数据
printf("P2 wrote to pipe and exiting\n");
exit(0);
} else { // 父进程
close(pipefd[0]); // 父进程不需要再操作读端
// 等待子进程写完,并读取内容
char buffer[BUFFER_SIZE];
read(pipefd[1], buffer, BUFFER_SIZE);
buffer[BUFFER_SIZE] = '\0'; // 添加终止符
printf("Parent received from P1: %s\n", buffer);
read(pipefd[1], buffer, BUFFER_SIZE);
buffer[BUFFER_SIZE] = '\0';
printf("Parent received from P2: %s\n", buffer);
close(pipefd[1]);
wait(NULL); // 等待所有子进程结束
exit(0);
}
}
```
在这个程序中,我们首先创建了一个管道,然后通过两次 fork() 分别创建了两个子进程 p1 和 p2。每个子进程都将它的标识符写入管道,然后退出。父进程等待子进程完成并读取管道中的内容。
运行此程序时,你会看到类似于这样的输出(假设成功完成):
```
Parent received from P1: child process P1
Parent received from P2: child process P2
```
阅读全文