两个用户管道通信

运行代码时,记得打开两个终端页面,可以通过两个终端页面进行通话;
用户1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/stat.h>
#include <fcntl.h>
#include<signal.h>
//在小明的页面,明read,明write
#define FIFO_FILE_MH  "./mh_fifo"//小明给小红发消息
#define FIFO_FILE_HM  "./hm_fifo"//小红给小明发消息
#define MSG_LE  50
#define EXIT "exit"

void fun(int num);
void fun(int num)
{
    if (close(STDIN_FILENO))
    {
        perror("关闭标准输入错误\n");
        exit(-1);
    }
    
}


int main(int argc, char const *argv[])
{
    umask(0000);
//创建小明管道
if (access(FIFO_FILE_MH,F_OK))
{
    if (mkfifo(FIFO_FILE_MH,0777)==-1)
    {
        perror("error1");
        return -1;
    }
}
    
    int fifo_fd_mh=open(FIFO_FILE_MH,O_RDWR);
    if (fifo_fd_mh==-1)
    {
       perror("open error");
       return -1;
    }
//创建小红管道
if (access(FIFO_FILE_HM,F_OK))
{
    if (mkfifo(FIFO_FILE_HM,0777)==-1)
    {
        perror("error1");
        return -1;
    }
}
    int fifo_fd_hm=open(FIFO_FILE_HM,O_RDWR);
    if (fifo_fd_hm==-1)
    {
       perror("open error");
       return -1;
    }



    pid_t pid=fork();
    if (pid==-1)
    {
       perror("pid error");
       exit(0);
    }
    else if (pid==0)
    {
        char msg[MSG_LE];
        while (1)
        {
           memset(msg,0,MSG_LE);
           if (read(fifo_fd_mh,msg,MSG_LE)==-1)//如果没有读到,不会打印小明说
           {
            perror("read error");
            exit(0);
           }

           if (strcmp(msg,EXIT)==0)//如果接受到退出信号,直接退出,不会往下运行
           {
            break;
           }
           

           printf("小明说:%s\n",msg);
           
        }
    }
    else
    {
        if (signal(SIGCHLD,fun)==SIG_ERR)
        {
            perror("signal...");
            exit(-1);
        }
        
        char msg[MSG_LE];
        while (1)
        {
           memset(msg,0,MSG_LE);
           printf("小红回复小明:");


           if(scanf("%s",msg)!=1)
           {
            break;
           }


           if (write(fifo_fd_hm,msg,strlen(msg))==-1)
           {
            perror("write error");
            exit(-1);
           }
           if (strcmp(msg,EXIT)==0)
           {
            if (write(fifo_fd_mh,EXIT,strlen(EXIT))==-1)
            {
                perror("write.....");
                exit(-1);
            }

           break;
            }
            
            
           
           
        }
    }


    printf("-------\n");
    if (close(fifo_fd_hm)==-1)
    {
        perror("colse error");
        exit(0);
    }
    if (close(fifo_fd_mh)==-1)
    {
        perror("colse error");
        exit(0);
    }

    
    return 0;
}
用户2
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/stat.h>
#include <fcntl.h>
#include<signal.h>


//在小明的页面,明read,明write
#define FIFO_FILE_MH "./mh_fifo"//小明给小红发消息
#define FIFO_FILE_HM "./hm_fifo"//小红给小明发消息
#define MSG_LE  50
#define EXIT "exit"

void fun(int num);
void fun(int num)
{
    if (close(STDIN_FILENO))
    {
        perror("关闭标准输入错误\n");
        exit(-1);
    }
    
}

int main(int argc, char const *argv[])
{
    umask(0000);
//创建小明管道
if (access(FIFO_FILE_MH,F_OK))//判断是否已经有该管道,没有创建,有就不管
{
    if (mkfifo(FIFO_FILE_MH,0777)==-1)
    {
        perror("error1");
        return -1;
    }
}
    
    int fifo_fd_mh=open(FIFO_FILE_MH,O_RDWR);
    if (fifo_fd_mh==-1)
    {
       perror("open error");
       return -1;
    }
//创建小红管道
if (access(FIFO_FILE_HM,F_OK))
{
    if (mkfifo(FIFO_FILE_HM,0777)==-1)
    {
        perror("error1");
        return -1;
    }
}
    int fifo_fd_hm=open(FIFO_FILE_HM,O_RDWR);
    if (fifo_fd_hm==-1)
    {
       perror("open error");
       return -1;
    }


//创建进程
    pid_t pid=fork();
    if (pid==-1)
    {
       perror("pid error");
       exit(0);
    }


//子进程进行读
    else if (pid==0)
    {
        char msg[MSG_LE];
        while (1)
        {
            //将读取的数据映射出来
           memset(msg,0,MSG_LE);

           //读取小明的文件
           if (read(fifo_fd_hm,msg,MSG_LE)==-1)
           {
            perror("read error");
            exit(0);
           }

           if (strcmp(msg,EXIT)==0)//如果输入exit,则退出
           {
            break;
           }
           
           printf("小红说:%s\n",msg);

        }
    }



//父进程进行写
    else
    {
        char msg[MSG_LE];

        if (signal(SIGCHLD,fun)==SIG_ERR)//发送信号关闭标准输入
        {
            perror("signal...");
            exit(-1);
        }
        
        while (1)
        {
           memset(msg,0,MSG_LE);
           printf("小明回复小红:");
           if(scanf("%s",msg)!=1)//如果标准输入法被关闭,则会输入-1
           {
            break;
           }

//将文件写到小红的文件
           if (write(fifo_fd_mh,msg,strlen(msg))==-1)
           {
            perror("write error");
            exit(-1);
           }


           if (strcmp(msg,EXIT)==0)
           {
            if(write(fifo_fd_hm,EXIT,strlen(EXIT))==-1)
            {
                perror("write...");
                return -1;
            }
            break;
           }
           
        }
    }

printf("------\n");//判断最后文件是否关闭
//关闭打开的文件
    if (close(fifo_fd_hm)==-1)
    {
        perror("colse error");
        exit(0);
    }

    if (close(fifo_fd_mh)==-1)
    {
        perror("colse error");
        exit(0);
    }

    return 0;
}

当用户一方发送“exit”时,聊天结束,即两个程序退出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值