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

文章目录

    • 原理
    • 架构
    • 代码实现

原理

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

架构

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

代码实现

A:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
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 
#include 
#include 
#include 
#include 
#include 
#include 
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;
}

你可能感兴趣的:(Linux,linux,运维,服务器)