用有名管道实现两个进程间的通信,制作一个简易的本地聊天室
在运行前,需要在当前路径下创建两个管道文件,(make fifo/make fifo1)
- 类客户端
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <signal.h>
int main(int argc, const char *argv[])
{
pid_t pid;
pid = fork();
if (pid < 0)
{
perror("fork");
exit(-1);
}else
if (pid > 0) // 父
{
printf("等待对方上线....\n");
waitpid(pid,NULL,WNOHANG);
int fr = open("fifo",O_RDONLY);
if (fr < 0)
{
perror("open");
exit(-1);
}
while(1)
{
char buf_read[100] = {0};
int ret = read(fr,buf_read,sizeof(buf_read));
if (ret == 0 || strncmp(buf_read,"quit",4) == 0)
{
printf("对方以下线!!!\n");
close(fr);
kill(pid,9);
exit(1);
}
printf(">收到消息:%s",buf_read);
memset(buf_read,0,sizeof(buf_read));
}
}
else if (pid == 0) // 子
{
int fw = open("fifo1",O_WRONLY);
if (fw < 0)
{
perror("open");
exit(-1);
}
while(1)
{
char buf_write[100] = {0};
printf(">");
fgets(buf_write, sizeof(buf_write), stdin);
if (strncmp(buf_write,"quit",4) == 0)
{
write(fw,buf_write,strlen(buf_write));
printf("buy!!!\n");
close(fw);
kill(getppid(),9);
exit(1);
}
write(fw,buf_write,strlen(buf_write));
memset(buf_write,0,sizeof(buf_write));
}
close(fw);
}
return 0;
}
- 类服务器端
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <signal.h>
int main(int argc, const char *argv[])
{
pid_t pid;
pid = fork();
if (pid < 0)
{
perror("fork");
exit(-1);
}else
if (pid > 0) // 父
{
printf("等待对方上线....\n");
// 以非阻塞的方式回收子进程资源
waitpid(pid,NULL,WNOHANG);
int fr = open("fifo1",O_RDONLY);
if (fr < 0)
{
perror("open");
exit(-1);
}
while(1)
{
char buf_read[100] = {0};
int ret = read(fr,buf_read,sizeof(buf_read));
if (ret == 0 || strncmp(buf_read,"quit",4) == 0)
{
printf("对方以下线!!!\n");
close(fr);
kill(pid,9);
exit(1);
}
printf(">收到消息:%s",buf_read);
memset(buf_read,0,sizeof(buf_read));
}
}
else if(pid == 0) // 子
{
int fw = open("fifo",O_WRONLY);
if (fw < 0)
{
perror("open");
exit(-1);
}
while(1)
{
char buf_write[100] = {0};
printf(">");
fgets(buf_write, sizeof(buf_write), stdin);
if (strncmp(buf_write,"quit",4) == 0)
{
write(fw,buf_write,strlen(buf_write));
printf("buy!!!\n");
close(fw);
kill(getppid(),9);
return 1;
}
write(fw,buf_write,strlen(buf_write));
memset(buf_write,0,sizeof(buf_write));
}
close(fw);
}
return 0;
}