1、课堂目标:
- 有名管道特点(了解)
- 有名管道创建(熟练)
- 有名管道读写(熟练)
- 小结
2、有名管道特点
- 有名管道的特点:
- 1、有名管道创建后有对应文件(p),可以在任意进程间通信。
- 2、打开管道时可以指定读写方式,会根据读写方式返回对应的读端和写端文件描述符
- 3、通过文件io操作,但内容存放在内存中,所以管道文件大小为0。当读端和写端都关闭后,管道中的内存就不存在了。
3、有名管道创建-mkfifo
#include
#include
int mkfifo(const char *pathname, mode_t mode);
- 成功返回0,失败返回EOF
- pathname创建的管道文件路径,没有路径代表当前路径
- mode管道的文件权限三个8进制数,由于管道不可执行,所有一般指定读写权限。
- 当创建完成管道后,先创建读端,读端的open函数会堵塞,直到写端被打开。
- 当创建完成管道并创建读写端后,写端关闭,读端会返回0。
4、有名管道读写-示例
- 进程A:循环从键盘输入并写入有名管道,输入quit时退出。
- 进程B:循环统计进程A每次打印写入管道的字符串内容和长度
#include
#include
#include
#include
#include
#include
#include
#define N 32
int main(void)
{
char buf[N];
int pfd;
char (*w_buf)[32];
//首次执行时打开
//新建有名管道
//打开写端
if((pfd = open("myfifo",O_WRONLY))<0)
{
perror("open");
exit(-1);
}
//循环从屏幕中获取写入
while(1)
{
w_buf = fgets(buf,N,stdin);//长度比数据多1,因为fgets接收了n
if(strcmp(buf,"quitn") == 0)//所以对比的时候需要对比n
{
break;
}
printf("write_data = %s",*w_buf);
write(pfd,buf,N);
memset(buf,0x0,sizeof(buf));
}
close(pfd);
return 0;
}
#include
#include
#include
#include
#include
#include
#include
#define N 32
int main(void)
{
char buf[N];
int pfd;
//打开读端
if((pfd = open("myfifo",O_RDONLY))<0)
{
perror("open");
exit(-1);
}
//循环从管道中获取,打印数据
while(read(pfd,buf,N)>0)
{
printf("buf = %s",buf);
printf("len = %dn",strlen(buf));//长度比数据多1,因为fgets接收了n
memset(buf,0x0,strlen(buf));
}
close(pfd);
return 0;
}
5、有名管道小结
- 有名管道特点
- mkfifo
- 有名管道打开会堵塞(创建管道后,只有打开一端后会堵塞,当读写两端都打开后会继续运行)
欢迎关注微信工作号,推送文章更及时。