本篇博文讲的是用两个命名管道实现简单聊天室的建立,本质上就是进程间的通信
程序共有四部分组成:命名管道myfifo
命名管道yourfifo
服务器端
客户端
功能实现过程:服务器端父进程往myfifo中写数据
客户端子进程从myfifo中读取服务器端父进程发送来的数据
客户端父进程往yourfifo中写数据
服务器端子进程从yourfifo中读取客户端父进程发送来的数据
服务器端:
#include
#include
#include
#include
#include
#include
#include
int main(int argc,char *argv[])
{
int fd,fd1;
pid_t fpid;
char buf[20],buf1[20];
int bytes_read,bytes_write;
int bytes_read1,bytes_write1;
if((mkfifo("myfifo",0666))<0)
{
printf("creat pipe error!!\n");
exit(1);
}
if((mkfifo("yourfifo",0666))<0)
{
printf("2___creat pipe error!!\n");
exit(2);
}
fpid=fork();
/*子进程,用来接收客户端进程发送来的信息*/
if(fpid==0)
{
while(1)
{
printf(">");
if((fd1=open("yourfifo",O_RDWR))<0)
{
printf("open yourfifo error!\n");
exit(10);
}
if((bytes_read=read(fd1,buf1,sizeof(buf1)))<0)
{
printf("read yourfifo error!\n");
exit(11);
}
buf1[bytes_read]='\0';
printf("%s\n",buf1);
close(fd1);
}
}
/*父进程,用于给客户端发送信息*/
if(fpid>0)
{
while(1)
{
if((fd=open("myfifo",O_RDWR))<0)
{
printf("open pipe error!\n");
exit(2);
}
printf(">");
scanf("%s",buf);
if((strcmp(buf,"quit"))==0)
{
exit(0);
}
if((bytes_write=write(fd,buf,sizeof(buf)))<0)
{
printf("write pipe error!!\n");
exit(3);
}
close(fd);
}
// close(fd);
}
return 0;
}
客户端 :
#include
#include
#include
#include
#include
#include
#include
int main(int argc,char *argv[])
{
int fd;
int fd1,fpid;
char buf[20],buf1[20];
int bytes_read,bytes_write;
int bytes_read1,bytes_write1;
fpid=fork();
/*子进程,发送信息给服务器端*/
if(fpid==0)
{
while(1)
{
printf(">");
scanf("%s",buf1);
if((strcmp(buf1,"quit"))==0)
{
exit(0);
}
if((fd1=open("yourfifo",O_RDWR))<0)
{
printf("open yourfifo error!\n");
exit(10);
}
if((bytes_write1=write(fd1,buf1,sizeof(buf1)))<0)
{
printf("write yourfifo error!\n");
exit(11);
}
close(fd1);
}
}
/*父进程,接收从服务器端发送来的信息*/
if(fpid>0)
{
while(1)
{
if((fd=open("myfifo",O_RDWR))<0)
{
printf("open pipe error!\n");
exit(2);
}
if((bytes_read=read(fd,buf,sizeof(buf)))<0)
{
printf("read fifo error!!\n");
exit(2);
}
buf[bytes_read]='\0';
printf("%s\n",buf);
close(fd);
}
// close(fd);
}
return 0;
}
打开两个终端,在其中一个中先运行服务器端
gcc -o fuwuqi fuwuqi.c
./fuwuqi
在另一个终端运行客户端
gcc -o kehuduan kehuduan.c
./kehuduan
至此,就可以在两个终端里对话了,输入quit退出
下一次运行前,删除上一次生成的myfifo yourfifo两个管道,再执行 ./fuwuqi ./kehuduan