1、使用有名管道实现两个进程之间的相互通信
//管道文件
#include<myhead.h>
int main(int argc, const char *argv[])
{//创建有名管道文件1if(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[])
{//以只写的形式打开管道文件1int fd1=open("./pipe1",O_WRONLY);if(fd1 == -1){perror("open error");return -1;}printf("fd1=%d\n",fd1);//以只读的形式打开管道文件2int 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[])
{//以只读的形式打开管道文件1int fd2=open("./pipe1",O_RDONLY);if(fd2 == -1){perror("open error");return -1;}printf("fd2=%d\n",fd2);//以只写的形式打开管道文件1int 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、思维导图