3.6作业

要求实现AB进程对话

a.A进程先发送一句话给B进程,B进程接收后打印

b.B进程再回复一句话给A进程,A进程接收后打印

c.重复1.2步骤,当收到quit后,要结束AB进程

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <signal.h>

int fd_r,fd_w;

int main(int argc, const char *argv[])
{

    if(mkfifo("./fifo", 0775) < 0)         //当前进程读该管道
    {
        if(17 != errno)     //#define EEXIST      17
        {
            perror("mkfifo");
            return -1;
        }
    }
    printf("fifo create success\n");

    if(mkfifo("./fifo1", 0775) < 0)     //当前进程写该管道
    {
        if(17 != errno)     //#define EEXIST      17
        {
            perror("mkfifo");
            return -1;
        }
    }
    printf("fifo1 create success\n");

    if (fork()>0)
    {
        fd_r = open("./fifo", O_RDONLY);     //B文件将此处改为fifo1
        if(fd_r < 0)
        {
            perror("open");
            return -1;
        }
        printf("open fifo rdonly success __%d__\n", __LINE__);

        char buf[128] = "";
        ssize_t res = 0;

        while(1)
        {
            bzero(buf, sizeof(buf));
            //读写段均存在,且管道中没有数据,该函数阻塞
            res = read(fd_r, buf, sizeof(buf));
            if(res < 0)
            {
                perror("read");
                return -1;
            }
            else if(0 == res)
            {
                printf("对端进程退出\n");
                break;
            }
            if(!strcmp(buf,"quit"))
            {
                kill(0,2);
            }
            printf("res=%ld : buf=%s\n", res, buf);
        }

    }
    else
    {
        fd_w = open("./fifo1", O_WRONLY);  //B文件将此处改为fifo
        if(fd_w < 0)
        {
            perror("open");
            return -1;
        }
        printf("open fifo wronly success __%d__\n", __LINE__);

        //从管道中读取数据
        char buf[128] = "";
        while(1)
        {
            /
            //向管道中写入数据
            bzero(buf, sizeof(buf));

            printf("请输入>>>"); 
            fgets(buf, sizeof(buf), stdin); 
            buf[strlen(buf)-1] = 0; 

            if(write(fd_w, buf, sizeof(buf)) < 0) 
            { 
                perror("write"); 
                return -1; 
            }
            printf("写入成功\n");
        }
    }

    close(fd_r);
    close(fd_w);

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值