快速业务通道

LINUX进程控制(3)

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-18

  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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号