思维导图
练习题
1.使用有名管道完成两个进程之间相互通信
user1.c
#include <myhead.h>
#define FIFO1 "./myfifo"
#define FIFO2 "./myfifo2"
//收取信息
void *task1(void *arg)
{
//创建fifo管道文件
mkfifo(FIFO2,0664);
//只读方式打开管道文件
int rfd = open(FIFO2, O_RDONLY);
if (rfd == -1)
{
perror("myfifo open error\n");
return NULL;
}
char buf[128] = "";
//将管道文件中的内容读出,并输出到终端上
while (1)
{
//清空buf多余字符
memset(buf, 0, sizeof(buf));
int res = read(rfd, buf, sizeof(buf));
printf("%s\n", buf);
//接收到quit信号退出
if (strcmp(buf, "quit") == 0)
{
break;
}
}
close(rfd);
}
//发送信息
void *task2(void *arg)
{
//只写打开管道文件
int wfd = open(FIFO1, O_WRONLY);
if (wfd == -1)
{
perror("myfifo open error\n");
return NULL;
}
char buf[128] = "";
//将终端输入内容写入buf
while (1)
{
//清空buf多余字符
memset(buf, 0, sizeof(buf));
int res = read(0, buf, sizeof(buf));
buf[strlen(buf) - 1] = '\0';
write(wfd, buf, sizeof(buf));
//输入quit发送退出信号
if (strcmp(buf, "quit") == 0)
{
break;
}
}
close(wfd);
}
int main(int argc, char const *argv[])
{
//创建两个线程,tid1负责收取信息,tid2负责发送信息
pthread_t tid1, tid2;
if (pthread_create(&tid1, NULL, task1, NULL) == -1)
{
printf("tid1 create error\n");
return -1;
}
if (pthread_create(&tid2, NULL, task2, NULL) == -1)
{
printf("tid2 create error\n");
return -1;
}
//回收线程资源
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
unlink(FIFO2);
return 0;
}
user2.c
#include <myhead.h>
#define FIFO1 "./myfifo"
#define FIFO2 "./myfifo2"
//收取信息
void *task1(void *arg)
{
//创建fifo管道文件
mkfifo(FIFO1,0664);
//只读方式打开管道文件
int rfd = open(FIFO1, O_RDONLY);
if (rfd == -1)
{
perror("myfifo open error\n");
return NULL;
}
char buf[128] = "";
//将管道文件中的内容读出,并输出到终端上
while (1)
{
//清空buf多余字符
memset(buf, 0, sizeof(buf));
int res = read(rfd, buf, sizeof(buf));
printf("%s\n", buf);
//接收到quit信号退出
if (strcmp(buf, "quit") == 0)
{
break;
}
}
close(rfd);
}
//发送信息
void *task2(void *arg)
{
//只写打开管道文件
int wfd = open(FIFO2, O_WRONLY);
if (wfd == -1)
{
perror("myfifo open error\n");
return NULL;
}
char buf[128] = "";
//将终端输入内容写入buf
while (1)
{
//清空buf多余字符
memset(buf, 0, sizeof(buf));
int res = read(0, buf, sizeof(buf));
buf[strlen(buf) - 1] = '\0';
write(wfd, buf, sizeof(buf));
//输入quit发送退出信号
if (strcmp(buf, "quit") == 0)
{
break;
}
}
close(wfd);
}
int main(int argc, char const *argv[])
{
//创建两个线程,tid1负责收取信息,tid2负责发送信息
pthread_t tid1, tid2;
if (pthread_create(&tid1, NULL, task1, NULL) == -1)
{
printf("tid1 create error\n");
return -1;
}
if (pthread_create(&tid2, NULL, task2, NULL) == -1)
{
printf("tid2 create error\n");
return -1;
}
//回收线程资源
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
unlink(FIFO1);
return 0;
}