基于命名管道与信号的进程间通信

任务描述

本关任务:编写小程序,先创建命名管道,子进程以读的方式打开,父进程以写的方式打开,查看相关输出。

相关知识

为了完成本关任务,你需要掌握:命名管道的的相关通信过程。

命名管道通信过程

无名管道是临时的,完成通信就自动消失。 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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值