本篇博文講的是用兩個命名管道實現簡單聊天室的建立,本質上就是進程間的通信
程序共有四部分組成:命名管道myfifo
命名管道yourfifo
服務器端
客戶端
功能實現過程:服務器端父進程往myfifo中寫數據
客戶端子進程從myfifo中讀取服務器端父進程發送來的數據
客戶端父進程往yourfifo中寫數據
服務器端子進程從yourfifo中讀取客戶端父進程發送來的數據
服務器端:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <string.h>
#include <fcntl.h>
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 <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <string.h>
#include <fcntl.h>
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