一、思维导图
二、练习题
1> 使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上一份
//创建有名管道
#include<myhead.h>
int main(int argc, const char *argv[])
{
//创建一个有名管道文件
if(mkfifo("./pipefile",0664) == -1)
{
perror("mkfifo error");
return -1;
}
printf("create success\n");
return 0;
}
//发送数据到有名管道
#include<myhead.h>
int main(int argc, const char *argv[])
{
//发送数据
//以写的形式打开管道文件
int wfd = open("./pipefile",O_WRONLY);
if(wfd == -1)
{
perror("open error");
return -1;
}
printf("open pipe write success\n");
//定义容器从标准输入写入数据到管道文件中
char wbuf[128] = "";
while(1)
{
printf("please enter >>>");
fgets(wbuf,sizeof(wbuf),stdin);
wbuf[strlen(wbuf)-1] = 0; //将'\n'换成'\0';
//将数据写入管道文件中
write(wfd,wbuf,strlen(wbuf));
//判断退出标志
if(strcmp("quit",wbuf) == 0)
{
break;
}
}
//关闭文件描述符
close(wfd);
return 0;
}
//从有名管道读取数据
#include<myhead.h>
int main(int argc, const char *argv[])
{
//接收数据
//以只读形式打开管道文件
int rfd = open("./pipefile",O_RDONLY);
if(rfd == -1)
{
perror("rfd open error");
return -1;
}
printf("open pipe read success\n");
//以只写的形式打开聊天记录文件
int cfd = open("./chat.txt",O_WRONLY|O_CREAT|O_TRUNC,0664);
if(cfd == -1)
{
perror("cfd open error");
return -1;
}
//定义容器从管道文件中读取数据
char rbuf[128];
while(1)
{
//清空容器
bzero(rbuf,sizeof(rbuf));
//将管道文件中的数据写入到容器中
read(rfd,rbuf,sizeof(rbuf));
//判断退出标志
if(strcmp(rbuf,"quit") == 0)
{
break;
}
//将读数据容器输出到终端
printf("received message:%s\n",rbuf);
rbuf[strlen(rbuf)] = '\n'; //将读数据容器末尾加上换成'\n'
//将读数据容器写入到聊天记录文件中
write(cfd,rbuf,sizeof(rbuf));
}
//关闭文件描述符
close(rfd);
close(cfd);
return 0;
}
2> 使用有名管道实现两个进程间相互通信
//创建有名管道
#include<myhead.h>
int main(int argc, const char *argv[])
{
//创建两个有名管道文件
//A向B发送消息的管道
if(mkfifo("./AtoB",0664) == -1)
{
perror("AtoB mkfifo error");
return -1;
}
printf("AtoB create success\n");
//B向A发送信息的管道
if(mkfifo("./BtoA",0664) == -1)
{
perror("BtoA mkfifo error");
return -1;
}
printf("BtoA create success\n");
return 0;
}
//A程序
#include<myhead.h>
int main(int argc, const char *argv[])
{
//创建子进程
pid_t pid = fork();
if(pid == 0)
{
//父进程,A向B发送数据,管道AtoB
//以写的形式打开管道文件
int wfd = open("./AtoB",O_WRONLY);
if(wfd ==-1)
{
perror("AtoB wfd open error");
return -1;
}
printf("open AtoB write success\n");
//定义容器将标准输入写入数据到管道文件中
char wbuf[128] = "";
while(1)
{
usleep(10);
// printf("please enter >>>");
fgets(wbuf,sizeof(wbuf),stdin);
wbuf[strlen(wbuf)-1] = 0; //将'\n'换成'\0'
//将数据写入到管道文件AtoB中
write(wfd,wbuf,strlen(wbuf));
//判断退出标志
if(strcmp("quit",wbuf) == 0)
{
break;
}
}
//关闭文件描述符
close(wfd);
//退出子进程
exit(EXIT_SUCCESS);
}
else if(pid > 0)
{
//子进程,A从B读取数据,管道BtoA
//以只读的形式打开管道文件BtoA
int rfd = open("./BtoA",O_RDONLY);
if(rfd == -1)
{
perror("BtoA rfd open error\n");
return -1;
}
printf("open BtoA read success\n");
//定义容器从管道文件中读取数据
char rbuf[128];
while(1)
{
//清空容器
bzero(rbuf,sizeof(rbuf));
//将管道文件中的数据写入到容器中
read(rfd,rbuf,sizeof(rbuf));
//判断退出标志
if(strcmp("quit",rbuf) == 0)
{
break;
}
//将读数据容器输出到终端
printf("received message from B:%s\n",rbuf);
}
//关闭文件描述符
close(rfd);
}
//回收子进程
waitpid(-1,NULL,WNOHANG);
return 0;
}
//B程序
int main(int argc, const char *argv[])
{
//创建子进程
pid_t pid = fork();
if(pid == 0)
{
//父进程,B向A发送数据,管道BtoA
//以写的形式打开管道文件
int wfd = open("./BtoA",O_WRONLY);
if(wfd ==-1)
{
perror("wfd open error");
return -1;
}
printf("open BtoA write success\n");
//定义容器将标准输入写入数据到管道文件中
char wbuf[128] = "";
while(1)
{
usleep(10);
// printf("please enter >>>");
fgets(wbuf,sizeof(wbuf),stdin);
wbuf[strlen(wbuf)-1] = 0; //将'\n'换成'\0'
//将数据写入到管道文件BtoA中
write(wfd,wbuf,strlen(wbuf));
//判断退出标志
if(strcmp("quit",wbuf) == 0)
{
break;
}
}
//关闭文件描述符
close(wfd);
//退出子进程
exit(EXIT_SUCCESS);
}
else if(pid > 0)
{
//子进程,B从A读取数据,管道AtoB
//以只读的形式打开管道文件AtoB
int rfd = open("./AtoB",O_RDONLY);
if(rfd == -1)
{
perror("AtoB rfd open error\n");
return -1;
}
printf("open AtoB read success\n");
//定义容器从管道文件中读取数据
char rbuf[128];
while(1)
{
//清空容器
bzero(rbuf,sizeof(rbuf));
//将管道文件中的数据写入到容器中
read(rfd,rbuf,sizeof(rbuf));
//判断退出标志
if(strcmp("quit",rbuf) == 0)
{
break;
}
//将读数据容器输出到终端
printf("received message from A:%s\n",rbuf);
}
//关闭文件描述符
close(rfd);
}
//回收子进程
waitpid(-1,NULL,WNOHANG);
return 0;
}