操作系统实验四:Linux下进程管道通信 任务1:使用Pipe创建管道,创建一个子进程,子进程向父进程发送消息“I am your son!”,父进程接收到子进程的消息后,显示在屏幕上,并向子进程发送“I am your father!”。子进程接收到父进程的消息并显示在屏幕上。 任务2:使用系统调用 pipe ( ) 建立一条管道线;两个子进程 P1 和 P2 分别向管道各写一句话 Child 1 is sending a message! Child 2 is sending a message! 而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。 任务3:能否创建一条管道,实现两个子进程之间的通信,如果可以,请实现并给出代码。如果不可以,请说明理由
时间: 2023-06-05 20:04:45 浏览: 762
抱歉,我可以回答您的问题。以下是对应任务的代码:
任务1:
```
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{
int fd[2];
pid_t pid;
char buf[20];
if(pipe(fd) < 0)
{
perror("pipe");
return 1;
}
pid = fork();
if(pid < 0)
{
perror("fork");
return 1;
}
if(pid == 0) //子进程
{
close(fd[0]); //关闭读端
char *str = "I am your son!";
write(fd[1], str, strlen(str)+1);
close(fd[1]); //关闭写端
return 0;
}
else //父进程
{
close(fd[1]); //关闭写端
read(fd[0], buf, sizeof(buf));
printf("%s\n", buf);
char *str = "I am your father!";
write(fd[0], str, strlen(str)+1);
close(fd[0]); //关闭读端
return 0;
}
}
```
任务2:
```
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{
int fd[2];
pid_t pid1, pid2;
char buf[20];
if(pipe(fd) < 0)
{
perror("pipe");
return 1;
}
pid1 = fork();
if(pid1 < 0)
{
perror("fork1");
return 1;
}
if(pid1 == 0) //子进程1
{
close(fd[0]); //关闭读端
char *str = "Child 1 is sending a message!";
write(fd[1], str, strlen(str)+1);
close(fd[1]); //关闭写端
return 0;
}
pid2 = fork();
if(pid2 < 0)
{
perror("fork2");
return 1;
}
if(pid2 == 0) //子进程2
{
close(fd[0]); //关闭读端
char *str = "Child 2 is sending a message!";
write(fd[1], str, strlen(str)+1);
close(fd[1]); //关闭写端
return 0;
}
close(fd[1]); //关闭写端
read(fd[0], buf, sizeof(buf));
printf("%s\n", buf);
read(fd[0], buf, sizeof(buf));
printf("%s\n", buf);
close(fd[0]); //关闭读端
return 0;
}
```
任务3:不能创建一条管道实现两个子进程之间的通信,因为管道是单向的,只能一个进程写,一个进程读,而不能做到两个进程同时读写同一个管道。如果想要实现两个进程之间的通信,可以采用共享内存或信号量等机制。
阅读全文