Linux 学习笔记7 文件操作——管道文件
创建管道文件命令:mkfifo
首先需要了解内核态和用户态的概念:
管道原理:
假设有两个进程,进程1为read进程,进程2为write进程,在内核态中都存在着一个buf缓冲区
两个进程之间具有独立的进程地址空间
两个进程之间通信:
打开一个文件(或者是一个管道文件),内核会开辟一段缓冲区, 此时内核会进行检查,发现是管道文件而且是read,就会进行阻塞,让read进程进入Sleep状态;打开write端时,就会对read端进行唤醒。此时,两个进程的缓冲区实际在内存中是一块内核区域的缓冲区。
利用管道实现即时聊天:
#include "func.h"
//先读再写
int main(int argc,char *argv[])
{
ARGS_CHECK(argc,3);
int fdr=open(argv[1],O_RDONLY);//以读的方式打开第一条管道
if(-1==fdr)
{
perror("open");
return -1;
}
int fdw=open(argv[2],O_WRONLY);//以写的方式打开第二条管道
ERROR_CHECK(fdw,-1,"open");
printf("I am mark2\n");
char buf[128]={0};
int ret;
while(1)
{
ret=read(fdr,buf,sizeof(buf));
ERROR_CHECK(ret,-1,"read");
printf("%s\n",buf);
memset(buf,0,sizeof(buf));
ret=read(STDIN_FILENO,buf,sizeof(buf));
ret=write(fdw,buf,strlen(buf)-1);
}
return 0;
}
#include "func.h"
//先写再读
int main(int argc,char *argv[])
{
ARGS_CHECK(argc,3);
int fdw=open(argv[1],O_WRONLY);//以写的方式打开第一条管道
if(-1==fdw)
{
perror("open");
return -1;
}
int fdr=open(argv[2],O_RDONLY);//以读的方式打开第二条管道
printf("I am mark1\n");//测试死锁,如果本句没打印即死锁
char buf[128]={0};
int ret;
while(1)
{
ret=read(STDIN_FILENO,buf,sizeof(buf));
ERROR_CHECK(ret,-1,"read");
ret=write(fdw,buf,strlen(buf)-1);
ERROR_CHECK(ret,-1,"write");
memset(buf,0,sizeof(buf));
ret=read(fdr,buf,sizeof(buf));
printf("%s\n",buf);
}
return 0;
}