一、使用有名管道完成两个进程的相互通信(提示:可以使用多进程或多线程完成)。
代码1:创建两个有名管道文件
#include<myhead.h>int main(int argc, const char *argv[])
{if(mkfifo("./mingtohua",0664)==-1)//创建小明向小华发信息的管道文件“mingtohua”{perror("mkfifo mingtohua error");return -1;}if(mkfifo("./huatoming",0664)==-1){perror("mkfifo huatoming error");//创建小华向小明发信息的管道文件“huatoming”return -1;}getchar();//阻塞等待 待聊天结束后删除两个管道文件system("rm mingtohua");system("rm huatoming");return 0;
}
代码2: 供小明发送、接收的代码:
#include<myhead.h>
void *send_message(void *arg);//负责发送信息的接口
void *receive_message(void *arg);//负责接收信息的接口int main(int argc, const char *argv[])
{pthread_t tid1,tid2;//创建两个线程if(pthread_create(&tid1,NULL,send_message,NULL)!=0)//负责发送信息的线程{puts("tid1 create error");return -1;}if(pthread_create(&tid2,NULL,receive_message,NULL)!=0)//负责接收信息{puts("tid2 create error");return -1;}if(pthread_join(tid1,NULL)==0 && pthread_join(tid2,NULL)==0)//等待回收两个线程{puts("xiaoming closed send&receive"); //成回收输出提示语句}puts("xiaoming off-line");//执行完成 函数结束前输出提示语句return 0;
}
void *send_message(void *arg)//发送信息
{int wfd=-1;//打开“mingtohua”管道文件if((wfd=open("./mingtohua",O_WRONLY))==-1){perror("open error");return NULL;}char wbuf[128]="";while(1){printf("请输入>>>");fgets(wbuf,sizeof(wbuf),stdin);//获取终端输入wbuf[strlen(wbuf)-1]=0;write(wfd,wbuf,strlen(wbuf));//向管道写入数据if(strcmp(wbuf,"quit")==0) //输入quit结束break;}close(wfd);//关闭管道文件pthread_exit(NULL);//释放发送信息的线程
}
void *receive_message(void *arg)//接收消息
{int rfd=-1;//打开“huatoming”管道文件if((rfd=open("./huatoming",O_RDONLY))==-1){perror("open error");return NULL;}char rbuf[128]="";while(1){bzero(rbuf,sizeof(rbuf));//清空数组read(rfd,rbuf,sizeof(rbuf));//读取管道内数据printf("收到信息:%s\n",rbuf);//终端输出消息if(strcmp(rbuf,"quit")==0)break;}close(rfd);//关闭文件pthread_exit(NULL);//退出线程
}
代码3: 供小明发送、接收的代码:
#include<myhead.h>
void *send_message(void *arg);
void *receive_message(void *arg);int main(int argc, const char *argv[])
{pthread_t tid1,tid2;//创建两个线程if(pthread_create(&tid1,NULL,send_message,NULL)!=0)//负责发送信息{puts("tid1 create error");return -1;}if(pthread_create(&tid2,NULL,receive_message,NULL)!=0)//负责接收信息{puts("tid2 create error");return -1;}if(pthread_join(tid1,NULL)==0 && pthread_join(tid2,NULL)==0){puts("xiaohua closed send&receive");}puts("xiaohua off-line");return 0;
}
void *send_message(void *arg)
{int wfd=-1;//打开管道文件if((wfd=open("./huatoming",O_WRONLY))==-1){perror("open error");return NULL;}char wbuf[128]="";while(1){printf("请输入>>>");fgets(wbuf,sizeof(wbuf),stdin);//获取终端输入wbuf[strlen(wbuf)-1]=0;write(wfd,wbuf,strlen(wbuf));//向管道写入数据if(strcmp(wbuf,"quit")==0)break;}close(wfd);pthread_exit(NULL);
}
void *receive_message(void *arg)
{int rfd=-1;if((rfd=open("./mingtohua",O_RDONLY))==-1){perror("open error");return NULL;}char rbuf[128]="";while(1){bzero(rbuf,sizeof(rbuf));//清空数组read(rfd,rbuf,sizeof(rbuf));//读取管道内数据printf("收到信息:%s\n",rbuf);if(strcmp(rbuf,"quit")==0)break;}close(rfd);pthread_exit(NULL);
}
运行图:
思维导图: