前言
如何实现简单的通信,在一台主机上,可以通过管道实现进程间的通信。
一、进程间的通信
我们通过有名管道即可实现简单的聊天,实现的思想如下,但是这样的会导致,一次只能发送一个,所以我们再添加了父子进程,一个接受,一个发送。
二、实现的代码
chatA.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
int main()
{
int ret = access("fifo1",F_OK);
if(ret==-1)
{
printf("管道不存在,创建对应的有名管道\n");
ret = mkfifo("fifo1",0664);
if(ret==-1)
{
perror("mkfifo");
exit(0);
}
}
ret = access("fifo2",F_OK);
if(ret==-1)
{
printf("管道不存在,创建对应的有名管道\n");
ret = mkfifo("fifo2",0664);
if(ret==-1)
{
perror("mkfifo");
exit(0);
}
}
int fdw = open("fifo1",O_WRONLY);
if(fdw==-1)
{
perror("open");
exit(0);
}
printf("打开管道fifo1成功,等待写入...\n");
int fdr = open("fifo2",O_RDONLY);
if(fdr==-1)
{
perror("open");
exit(0);
}
printf("打开管道fifo2成功,等待读取...\n");
pid_t pid=fork();
if(pid>0)
{
char bufw[128];
while(1)
{
memset(bufw,0,128);
fgets(bufw,128,stdin);
int ret2= write(fdw,bufw,strlen(bufw));
if(ret2==-1)
{
perror("write");
exit(0);
}
}
}
else if(pid ==0)
{
char bufr[128];
while(1)
{
memset(bufr,0,128);
int ret3 = read(fdr,bufr,128);
if(ret3<=0)
{
perror("read");
break;
}
printf("buf:%s\n",bufr);
}
}
close(fdw);
close(fdr);
return 0;
}
chatB.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
int main()
{
int ret = access("fifo1",F_OK);
if(ret==-1)
{
printf("管道不存在,创建对应的有名管道\n");
ret = mkfifo("fifo1",0664);
if(ret==-1)
{
perror("mkfifo");
exit(0);
}
}
ret = access("fifo2",F_OK);
if(ret==-1)
{
printf("管道不存在,创建对应的有名管道\n");
ret = mkfifo("fifo2",0664);
if(ret==-1)
{
perror("mkfifo");
exit(0);
}
}
int fdr = open("fifo1",O_RDONLY);
if(fdr==-1)
{
perror("open");
exit(0);
}
printf("打开管道fifo1成功,等待读取...\n");
int fdw = open("fifo2",O_WRONLY);
if(fdw==-1)
{
perror("open");
exit(0);
}
printf("打开管道fifo2成功,等待写入...\n");
pid_t pid=fork();
if(pid>0)
{
char bufr[128];
while(1)
{
memset(bufr,0,128);
int ret3 = read(fdr,bufr,128);
if(ret3<=0)
{
perror("read");
break;
}
printf("buf:%s\n",bufr);
}
}else if(pid==0)
{
char bufw[128];
while(1)
{
memset(bufw,0,128);
fgets(bufw,128,stdin);
int ret2 = write(fdw,bufw,strlen(bufw));
if(ret2==-1)
{
perror("write");
exit(0);
}
}
}
close(fdr);
close(fdw);
return 0;
}
总结
这篇文章注意阐述了如何用有名管道实现简单的聊天。
管道的特点:
1.管道中数据的传递方向的单向的,一端用于写入,一端用于读取,管道是半双工的。
2.从管道读取数据是一次性操作,数据一旦被读走,它就从管道中被抛弃,释放空间
便写更多的数据,在管道中无法使用lseek()来随机的访问数据。
3.匿名管道只能在具有关系的进程之间使用。
|