任务描述
本关任务:编写小程序,先创建命名管道,子进程以读的方式打开,父进程以写的方式打开,查看相关输出。
相关知识
为了完成本关任务,你需要掌握:命名管道的的相关通信过程。
命名管道通信过程
无名管道是临时的,完成通信就自动消失。 1)必须同时有读和写操作,可以是一个或者多个进程 2)无数据,读堵塞 有数据,小于预读取量,读出所有。 有数据,大于预读取量,读出期望数量。 3)无空间,写堵塞 有空间,小于欲写入量,写满阻塞。 有空间,大于欲写入量,写完返回。 4)中途一个退出操作 写退出,返回SIGPIPE信号。 读退出,读操作不阻塞,直接返回0。
编程思路
根据提示,在右侧编辑器补充代码,使用SIGPIPE信号进行记录,读通道关闭后写通道写入。首先子进程以读的方式打开管道,然后父进程以写的方式打开管道,父进程当即睡眠1秒,子进程关闭读管道,当父进程休眠完成后开始写入,会发出写入失败信号。
测试说明
平台会对你编写的代码进行测试:
测试输入:编译程序; 预期输出: sig=13
#include<stdio.h>
#include<string.h>
#include<fcntl.h>
#include<signal.h>
#include<sys/types.h>
void handler(int sig)
{
printf("sig=%d\n",sig);
}
int main(void)
{
int j;
signal(SIGPIPE,handler);//在reader中止之后写Pipe的时候发送
unlink("FIFO");
mkfifo("FIFO",0644);
pid_t pid;
pid=fork();
if(pid==0)
{
/*子进程打开读管道,随后关闭管道*/
int fd;
fd = open("FIFO",O_RDONLY);
close(fd);
}
else
{
/*父进程打开写通道,休眠1秒,尝试写入*/
int fd;
fd = open("FIFO",O_WRONLY);
int ret;
sleep(1);
ret = write(fd,"heoolOpenEuler",14);
}
}