在两个进程间进行通信的小demo

一、AB进程对话

1.1 要求:

  1. A进程先发送一句话给B进程,B进程接收后打印
  2. B进程再回复一句话给A进程,A进程接收后打印
  3. 重复1.2步骤,当收到quit后,要结束AB进程
  4. 提示:两根管道

1.2 思路

  • 需要俩有名管道
  • 一个进程先对有名管道进行写入,然后等待读取另一个有名管道
  • 而另一个相反,先等待读取有名管道数据,然后再进行写入

二、 代码实现

2.1 a_fifo.c

#include <my_head.h>

int main(int argc, const char *argv[])
{
    umask(0);
    //  创建有名管道 fifo_a
    if (mkfifo("fifo_a", 0664) < 0)
    {
        if (errno != EEXIST)
        {
            ERR_MSG("mkfifo");
            return -1;
        }
    }
    //  创建有名管道 fifo_b
    if (mkfifo("fifo_b", 0664) < 0)
    {
        if (errno != EEXIST)
        {
            ERR_MSG("mkfifo");
            return -1;
        }
    }

    //  打开管道
    int fd_w = open("fifo_a", O_WRONLY);
    int fd_r = open("fifo_b", O_RDONLY);
    char buff[128];
    ssize_t res;
    while (1)
    {
        bzero(buff, sizeof(buff));
        printf("我说: ");
        fgets(buff, sizeof(buff), stdin);
        buff[strlen(buff) - 1] = 0;

        if (0 == strcmp(buff, "exit"))
        {
            break;
        }
        if (write(fd_w, buff, sizeof(buff)) < 0)
        {
            ERR_MSG("write_a");
            return -1;
        }
        printf("-----------------\n");

        bzero(buff, sizeof(buff));

        res = read(fd_r, buff, sizeof(buff));
        if (res < 0)
        {
            ERR_MSG("read");
            return -1;
        }
        else if (0 == res)
        {
            printf("对话结束\n");
            break;
        }
        printf("B说: %s\n", buff);
    }

    return 0;
}

2.2 b_fifo.c

#include <my_head.h>

int main(int argc, const char *argv[])
{
    umask(0);
    //  创建有名管道 fifo_a
    if (mkfifo("fifo_a", 0664) < 0)
    {
        if (errno != EEXIST)
        {
            ERR_MSG("mkfifo");
            return -1;
        }
    }
    //  创建有名管道 fifo_b
    if (mkfifo("fifo_b", 0664) < 0)
    {
        if (errno != EEXIST)
        {
            ERR_MSG("mkfifo");
            return -1;
        }
    }

    //  打开管道
    int fd_r = open("fifo_a", O_RDONLY);
    if (fd_r < 0)
    {
        ERR_MSG("open fd_r");
        return -1;
    }
    int fd_w = open("fifo_b", O_WRONLY);
    if (fd_w < 0)
    {
        ERR_MSG("open fd_r");
        return -1;
    }

    char buff[128];
    ssize_t res;
    while (1)
    {
        bzero(buff, sizeof(buff));

        res = read(fd_r, buff, sizeof(buff));
        if (res < 0)
        {
            ERR_MSG("read");
            return -1;
        }
        else if (0 == res)
        {
            printf("对话结束\n");
            break;
        }
        printf("A说: %s\n", buff);

        bzero(buff, sizeof(buff));
        printf("我说: ");
        fgets(buff, sizeof(buff), stdin);
        buff[strlen(buff) - 1] = 0;

        if (0 == strcmp(buff, "exit"))
        {
            break;
        }
        if (write(fd_w, buff, sizeof(buff)) < 0)
        {
            ERR_MSG("write_a");
            return -1;
        }
        printf("-----------------\n");
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhk___

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值