运行代码时,记得打开两个终端页面,可以通过两个终端页面进行通话;
用户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”时,聊天结束,即两个程序退出