#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<fcntl.h>
#include<string.h>
#if 1
//创建两个FIFO实现不同进程间的全双工通信 --实现自由通信
//有名管道的创建及读写extern int errno;
//..............ser.c --服务端
int main()
{
if(access("write_fifo",F_OK) == -1)
{
int res = mkfifo("write_fifo",0666);
if(res == -1)
{
printf("errno = %d\n",errno);
perror("mkfifo");
exit(1);
}
}
//printf("11111111111111111111111111\n");
//服务端先进行写的操作 ,再进行读的操作
int write_fd = open("write_fifo",O_WRONLY); //以只写方式打开
if(write_fd == -1)
{
perror("open write_fifo");//打开写管道失败
exit(1);
}
int read_fd = open("read_fifo",O_RDONLY);
if(read_fd == -1)
{
perror("open read_fifo"); //打开读管道失败
// unlink("read_fifo");
exit(1);
}
char sendbuf[256];
char recvbuf[256];
pid_t pid1,pid2;
int status;
pid1=fork();//创建进程
if(pid1 == -1)
{
printf("create fork error\n");
exit(1);
}
else if(pid1 == 0)//子进程
{
while(1)
{
read(read_fd,recvbuf,256);
printf("Cli:>%s\n",recvbuf);
}
}
else if(pid1>0)
{
pid2 = fork();
if(pid2 == -1)
{
printf("create fork2 erroe\n");
exit(1);
}
if(pid2 == 0)
{
while(1)
{
printf("Ser:>");
//if(read_fd == 0)
// {
// printf("\n");
// }
// gets(sendbuf);
scanf("%s",sendbuf);
if(strcmp(sendbuf,"quit") == 0) //比较是否相等 相等就退出
{
close(write_fd);//文件描述符
unlink("write_fifo");//删除管道
break;
}
write(write_fd,sendbuf,strlen(sendbuf)+1);
}
}
if(pid2 >0)
{
wait(&status);
}
}
/*while(1) //只能实现你说一句我说一句
{
printf("Ser:>");
scanf("%s",sendbuf);
write(write_fd,sendbuf,strlen(sendbuf)+1);
read(read_fd,recvbuf,256);
printf("Cli:>%s\n",recvbuf);
}*/
return 0;
}
//.........cli.c --客户端
int main()
{
// 对文件是否存在以及文件权限进行检查,若不存在,进入access创建管道
if(access("read_fifo",F_OK) == -1)
{
int res = mkfifo("read_fifo",0666);
if(res == -1)
{
perror("mkfifo");
exit(1);
}
}
//客户端先进行读的操作 在进行写的操作
int read_fd = open("write_fifo", O_RDONLY);
if(read_fd == -1)
{
perror("open write_fifo");
exit(1);
}
int write_fd = open("read_fifo",O_WRONLY);
if(write_fd == -1)
{
perror("open read_fifo");
unlink("read_fifo");
exit(1);
}
int status;
char sendbuf[256];
char recvbuf[256];
pid_t pid1,pid2;
pid1=fork();
if(pid1 == -1)
{
printf("create fork error\n");
exit(1);
}
else if(pid1 == 0)
{
while(1)
{
read(read_fd,recvbuf,256);
printf("Ser:>%s\n",recvbuf);
}
}
else if(pid1 >0)
{
pid2 = fork();
if(pid2 ==-1)
{
printf("create fork2 error\n");
exit(1);
}
else if(pid2 == 0)
{
while(1)
{
printf("Cli:>");
// gets(sendbuf);
scanf("%s",sendbuf);
if(strcmp(sendbuf,"quit") == 0)
{
close(write_fd);
unlink("read_fifo");
break;
}
write(write_fd,sendbuf,strlen(sendbuf)+1);
}
}
else if(pid2>0)
{
wait(&status);
}
}
/*
while(1) //只能你说一句我说一句
{
read(read_fd,recvbuf,256);
printf("Ser:>%s\n",recvbuf);
printf("Cli:>");
scanf("%s",sendbuf);
write(write_fd,sendbuf,strlen(sendbuf)+1);
}*/
return 0;
}
#endif
通信方式-有名管道的创建和读写
最新推荐文章于 2024-04-11 10:46:09 发布