Linux多进程应用——聊天功能实现

原理

采用多进程+有名管道实现

架构

有A、B两个聊天进程,在每个进程中分别创建子进程,使其读写分开。
A:
父进程:负责发送信息
子进程:负责接收信息
B:
父进程:接收信息
子进程:发送信息
管道:
fifo1:A->B
fifo2:A<-B

代码实现

A:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    //判断管道是否存在,不存在就创建
    int ret = access("fifo1", F_OK);
    if(ret == -1)
    {
        printf("不存在管道fifo1, 正在创建...\n");
        ret = mkfifo("fifo1", 0777);
    }
    ret = access("fifo2", F_OK);
    if(ret == -1)
    {
        printf("不存在管道fifo2, 正在创建...\n");
        ret = mkfifo("fifo2", 0777);
    }

    pid_t pid = fork();
    if(pid == 0)//子进程
    {
        int fdw = open("fifo1", O_WRONLY);
        if(fdw == -1)
        {
            perror("write_fifo1");
            exit(0);
        }
        //写数据,一直获取键盘输入,然后发送
        char buf[1024];
        while(1)
        {
            memset(buf, 0, sizeof(buf));
            fgets(buf, 1024,stdin);
            ret = write(fdw, buf, sizeof(buf));
            if(ret == -1)
            {
                perror("Asend:");
                close(fdw);
                exit(0);
            }
            
        }
    }
    else if(ret > 0)//父进程
    {
       int fdr = open("fifo2", O_RDONLY);
        if(fdr == -1)
        {
            perror("read_fifo2");
            exit(0);
        }

        char rbuf[1024];
        while(1)
        {
            memset(rbuf, 0, sizeof(rbuf));
            ret = read(fdr, rbuf, sizeof(rbuf));
            if(ret <=0 )
            {
                perror("Areceive");
                close(fdr);
                exit(0);
            }
            printf("Areceive:%s", rbuf);
        }
    }


    return 0;
}

B:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    //判断管道是否存在,不存在就创建
    int ret = access("fifo1", F_OK);
    if(ret == -1)
    {
        printf("不存在管道fifo1, 正在创建...\n");
        ret = mkfifo("fifo1", 0777);
    }
    ret = access("fifo2", F_OK);
    if(ret == -1)
    {
        printf("不存在管道fifo2, 正在创建...\n");
        ret = mkfifo("fifo2", 0777);
    }

    pid_t pid = fork();
    if(pid == 0)//子进程
    {
        int fdr = open("fifo1", O_RDONLY);
        if(fdr == -1)
        {
            perror("reak_fifo1");
            exit(0);
        }
        char rbuf[1024];
        while(1)
        {
            memset(rbuf, 0, sizeof(rbuf));
            ret = read(fdr, rbuf, sizeof(rbuf));
            if(ret <=0 )
            {
                perror("Breceive");
                close(fdr);
                exit(0);
            }
            printf("Breceive:%s", rbuf);
        }
    }
    else if(ret > 0)//父进程
    {
       int fdw = open("fifo2", O_WRONLY);
        if(fdw == -1)
        {
            perror("write_fifo2");
            exit(0);
        }
        //写数据,一直获取键盘输入,然后发送
        char buf[1024];
        while(1)
        {
            memset(buf, 0, sizeof(buf));
            fgets(buf, 1024,stdin);
            ret = write(fdw, buf, sizeof(buf));
            if(ret == -1)
            {
                perror("Asend:");
                close(fdw);
                exit(0);
            } 
        }
    }


    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小猛笔记

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

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

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

打赏作者

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

抵扣说明:

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

余额充值