LINUX进程控制(3)
5.4. 管道(FIFO) 与无名管道PIPE工作方式类似的,还有另一种管道:命名管道(First In,First Out).两者区别在于:PIPE不是持久的,即使用PIPE的所有进程终止后,PIPE自动消失;而FIFO对应于一个物理文件,是持久的,并且多个无继承进程可以根据该物理文件打开并使用同一个FIFO. 5.4.1. 创建、删除FIFO文件 创建FIFO文件与创建普通文件很类似,只是创建后的文件用于FIFO. 原型: #include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *pathname, mode_t mode); 参数pathname为要创建的FIFO文件的全路径名; 参数mode为文件访问权限 如果创建成功,则返回0,否则-1. 示例: //MkFifo.cpp{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <stdio.h> 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 <unistd.h> 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 <time.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <stdio.h> #include <fcntl.h> 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,st |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |