编写一段程序,使用系统调用pipe()建立一条管道线,同时父进程生成2个子进程分别向这条管道写一句话:child1 is sending a message! Child2 is sending a message! 父进程则循环从管道中读出信息,显示在屏幕上。(提示:两个子进程向管道中写入字符的时候要保持互斥,使用lockf)
时间: 2024-02-13 20:07:21 浏览: 121
进程间通信,通过Pipe管道实现
请参考下面的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/wait.h>
int main() {
int fd[2];
pid_t pid1, pid2;
char msg1[] = "Child1 is sending a message!";
char msg2[] = "Child2 is sending a message!";
char buf[1024];
// 建立管道
if (pipe(fd) < 0) {
perror("pipe error");
exit(EXIT_FAILURE);
}
// 创建子进程1
if ((pid1 = fork()) < 0) {
perror("fork error");
exit(EXIT_FAILURE);
} else if (pid1 == 0) { // 子进程1
close(fd[0]); // 关闭管道读端
lockf(fd[1], F_LOCK, 0);
write(fd[1], msg1, sizeof(msg1));
lockf(fd[1], F_ULOCK, 0);
close(fd[1]);
exit(EXIT_SUCCESS);
}
// 创建子进程2
if ((pid2 = fork()) < 0) {
perror("fork error");
exit(EXIT_FAILURE);
} else if (pid2 == 0) { // 子进程2
close(fd[0]); // 关闭管道读端
lockf(fd[1], F_LOCK, 0);
write(fd[1], msg2, sizeof(msg2));
lockf(fd[1], F_ULOCK, 0);
close(fd[1]);
exit(EXIT_SUCCESS);
}
// 父进程
close(fd[1]); // 关闭管道写端
while (wait(NULL) != -1) { // 等待子进程结束
if (read(fd[0], buf, sizeof(buf)) > 0) {
printf("%s\n", buf);
}
}
close(fd[0]);
exit(EXIT_SUCCESS);
}
```
程序中使用`pipe()`函数建立管道,然后分别创建两个子进程,每个子进程向管道中写入一条消息,并且在写入的时候使用`lockf()`函数保证互斥。最后,父进程从管道中读取信息并将其输出到屏幕上。
阅读全文