一、使用有名管道完成兩個進程的相互通信(提示:可以使用多進程或多線程完成)。
代碼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);
}
運行圖:
思維導圖: