作者:. | 来源:互联网 | 2017-10-28 22:33
5.4. 管道(FIFO)
与无名管道PIPE工作方式类似的,还有另一种管道:命名管道(First In,First Out)。两者区别在于:PIPE不是持久的,即使用PIPE的所有进程终止后,PIPE自动消失;而FIFO对应于一个物理文件,是持久的,并且多个无继承进程可以根据该物理文件打开并使用同一个FIFO。
5.4.1. 创建、删除FIFO文件
创建FIFO文件与创建普通文件很类似,只是创建后的文件用于FIFO。
原型:
#include
#include
int mkfifo(const char *pathname, mode_t mode);
参数pathname为要创建的FIFO文件的全路径名;
参数mode为文件访问权限
如果创建成功,则返回0,否则-1。
示例:
//MkFifo.cpp{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
#include
#include
#include
#include
int main(int argc,char *argv[])
{
mode_t iRight=0666;
if(argc!=2){
puts("Usage: MkFifo.exe {filename}");
return -1;
}
if(mkfifo(argv[1],iRight)<0){
perror("mkfifo fail");
return -2;
}
return 0;
}
//MkFifo.cpp}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
shell>MkFifo.exe MyFifo.dat
shell>ll
total 16
-rw-rw-r-- 1 ghaha ghaha 296 Oct 29 08:40 MkFifo.cpp
prw-rw-r-- 1 ghaha ghaha 0 Oct 29 08:43 MyFifo.dat
-rwxrwxr-x 1 ghaha ghaha 11939 Oct 29 08:41 MkFifo.exe
shell>MkFifo MyFifo.dat//第二次创建将报文件存在的错误。
mkfifo fail: File exists
删除文件的函数原型为:
#include
int unlink(const char *pathname);
5.4.2. 打开、关闭FIFO文件
对FIFO类型的文件的打开/关闭跟普通文件一样,都是使用open函数。如果打开时使用O_WRONLY选项,则打开FIFO的写入端,如果使用O_RDONLY选项,则打开FIFO的读取端,写入端和读取端都可以被几个进程同时打开。
如果以读取方式打开FIFO,并且还没有其他进程以写入方式打开FIFO,open函数将被阻塞;同样,如果以写入方式打开FIFO,并且还没其他进程以读取方式FIFO,open函数也将被阻塞。但是,如果open函数中包含O_NONBLOCK选项,则上述两种情况下调用open都不被阻塞。
与PIPE相同,关闭FIFO时,如果先关读取端,将导致继续往FIFO中写数据的进程接收SIG_PIPE的信号。
5.4.3. 读写FIFO
可以采用与普通文件相同的读写方式读写FIFO,
示例:
//WriteFifo.cpp{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc,char *argv[])
{
char szBuf[128];
int iRet,fdFifo;
puts("open for writing.");
fdFifo=open("MyFifo.pip",O_WRONLY);
if(fdFifo<0){
perror("open fifo fail");
return -1;
}
puts("begin write\n");
srand(time(NULL));
for(int i=0;i<10;i++){
sprintf(szBuf,"ps %d write %d",getpid(),i);
printf("%s\n",szBuf);
iRet=write(fdFifo,szBuf,strlen(szBuf));
if(iRet<0){
perror("write fifo fail");
return -2;
}
int iuSec=int(1000*1000*(double(rand())/RAND_MAX));
usleep(iuSec);
}
close(fdFifo);
return 0;
}
//WriteFifo.cpp}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
[1] [2] [3] [4] 下一页