原理
采用多进程+有名管道实现
架构
有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;
}