1> 使用有名管道实现两个进程之间的相互通信
//创建管道文件
#include <myhead.h>
int main(int argc, const char *argv[])
{
//创建2个有名管道
int fifo1 = mkfifo("./myfifo1",0664);
if(fifo1 != 0)
{
perror("fifo1 mkfilo error");
return -1;
}
int fifo2 = mkfifo("./myfifo2",0664);
if(fifo2 != 0)
{
perror("fifo2 mkfilo error");
return -1;
}
getchar();
//删除管道文件
unlink("myfifo1");
unlink("myfifo2");
return 0;
}
#include <myhead.h>
//B线程1接收数据
void *task1(void *arg)
{
//打开有名管道文件
int rfd = open("./myfifo1",O_RDONLY);
if(rfd == -1)
{
perror("rfd open error");
return NULL;
}
//printf("%#lx\n",pthread_self());
//写入数据
char rbuf[1024];
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);
}
//B线程2发送数据
void *task2(void *arg)
{
//打开有名管道文件
int wfd = open("./myfifo2",O_WRONLY);
if(wfd == -1)
{
perror("wfd open error");
return NULL;
}
//printf("%#lx\n",pthread_self());
//写入数据
char wbuf[1024] = "";
while(1)
{
//从终端读取数据
printf("请输入>>>");
fgets(wbuf,sizeof(wbuf),stdin);
wbuf[(strlen(wbuf)-1)] = '\0';
//把数据写入管道文件
write(wfd,wbuf,strlen(wbuf));
printf("发送成功!\n");
if(strcmp(wbuf,"quit") == 0)
{
break;
}
}
//关闭文件
close(wfd);
//退出线程
pthread_exit(NULL);
}
/***********************主函数***************************/
int main(int argc, const char *argv[])
{
//创建2个线程
pthread_t tid1,tid2;
if(pthread_create(&tid1,NULL,task1,NULL) != 0)
{
printf("进程A的线程1创建失败!\n");
return -1;
}
if(pthread_create(&tid2,NULL,task2,NULL) != 0)
{
printf("进程A的线程2创建失败!\n");
return -2;
}
printf("tid1 = %#lx,tid2 = %#lx\n",tid1,tid2);
//阻塞等待回收线程
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}
#include <myhead.h>
//A线程1发送数据
void *task1(void *arg)
{
//打开有名管道文件
int wfd = open("./myfifo1",O_WRONLY);
if(wfd == -1)
{
perror("wfd open error");
return NULL;
}
//printf("%#lx\n",pthread_self());
//写入数据
char wbuf[1024] = "";
while(1)
{
//从终端读取数据
printf("请输入>>>");
fgets(wbuf,sizeof(wbuf),stdin);
wbuf[(strlen(wbuf)-1)] = '\0';
//把数据写入管道文件
write(wfd,wbuf,strlen(wbuf));
printf("发送成功!\n");
if(strcmp(wbuf,"quit") == 0)
{
break;
}
}
//关闭文件
close(wfd);
//退出线程
pthread_exit(NULL);
}
//A线程2接收数据
void *task2(void *arg)
{
//打开有名管道文件
int rfd = open("./myfifo2",O_RDONLY);
if(rfd == -1)
{
perror("rfd open error");
return NULL;
}
//printf("%#lx\n",pthread_self());
//写入数据
char rbuf[1024];
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);
}
/***********************主函数***************************/
int main(int argc, const char *argv[])
{
//创建2个线程
pthread_t tid1,tid2;
if(pthread_create(&tid1,NULL,task1,NULL) != 0)
{
printf("进程A的线程1创建失败!\n");
return -1;
}
if(pthread_create(&tid2,NULL,task2,NULL) != 0)
{
printf("进程A的线程2创建失败!\n");
return -2;
}
printf("tid1 = %#lx,tid2 = %#lx\n",tid1,tid2);
//阻塞等待回收线程
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}