1、使用有名管道实现两个进程之间的相互通信
//管道文件
#include<myhead.h>
int main(int argc, const char *argv[])
{
//创建有名管道文件1
if(mkfifo("./pipe1",0664)==-1)
{
perror("创建管道文件失败");
return 0;
}
if(mkfifo("./pipe2",0664)==-1)
{
perror("创建管道文件失败");
return 0;
}
getchar(); //防止当前进程结束
unlink("pipe1");
unlink("pipe2");
return 0;
}
#include<myhead.h>
int main(int argc, const char *argv[])
{
//以只写的形式打开管道文件1
int fd1=open("./pipe1",O_WRONLY);
if(fd1 == -1)
{
perror("open error");
return -1;
}
printf("fd1=%d\n",fd1);
//以只读的形式打开管道文件2
int fd2=open("./pipe2",O_RDONLY);
if(fd2 == -1)
{
perror("open error");
return -1;
}
printf("fd2=%d\n",fd2);
//创建子进程
pid_t pid1=fork();
//判断读写进程
if(pid1>0)
{
//接收数据字符数组
char arr[180]="";
while(1)
{
printf("请输入数据:");
fgets(arr,sizeof(arr),stdin); //向终端输入字符串
arr[strlen(arr)-1]='\0'; //将'\n'换成'\0'
//向管道文件1中写入数据
write(fd1,arr,strlen(arr));
printf("发送成功\n");
if(strcmp(arr,"q") == 0)
{
break;
}
}
}
else if(pid1==0)
{
//接收数据字符数组
char brr[180]="";
while(1)
{
bzero(brr,sizeof(brr)); // 清空文件中读取的数据
read(fd2,brr,sizeof(brr));
printf("\n收到的消息为:%s\n",brr);
if(strcmp(brr,"q")==0)
{
break;
}
}
//退出子进程
exit(EXIT_SUCCESS);
}
wait(NULL);
//关闭文件
close(fd1);
close(fd2);
return 0;
}
#include<myhead.h>
int main(int argc, const char *argv[])
{
//以只读的形式打开管道文件1
int fd2=open("./pipe1",O_RDONLY);
if(fd2 == -1)
{
perror("open error");
return -1;
}
printf("fd2=%d\n",fd2);
//以只写的形式打开管道文件1
int fd1=open("./pipe2",O_WRONLY);
if(fd1 == -1)
{
perror("open error");
return -1;
}
printf("fd1=%d\n",fd1);
//创建子进程
pid_t pid2=fork();
//判断读写进程
if(pid2>0)
{
//接收数据字符数组
char brr[180]="";
while(1)
{
bzero(brr,sizeof(brr)); // 清空文件中读取的数据
read(fd2,brr,sizeof(brr));
printf("\n收到的消息为:%s\n",brr);
if(strcmp(brr,"q")==0)
{
break;
}
}
}
else if(pid2==0)
{
//接收数据字符数组
char arr[180]="";
while(1)
{
printf("请输入数据:");
fgets(arr,sizeof(arr),stdin); //向终端输入字符串
arr[strlen(arr)-1]='\0'; //将'\n'换成'\0'
//向管道文件1中写入数据
write(fd1,arr,strlen(arr));
printf("发送成功\n");
if(strcmp(arr,"q") == 0)
{
break;
}
}
//退出子进程
exit(EXIT_SUCCESS);
}
wait(NULL);
//关闭文件
close(fd1);
close(fd2);
return 0;
}
2、思维导图