当前位置:  首页  >  服务器技术  >  Linux/unix  >  Linux教程

LINUX进程控制(3)

文章标题:LINUX进程控制(3)。Linux是中国IT实验室的一个技术频道。包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类

  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] 下一页

吐了个 "CAO" !
扫码关注 PHP1 官方微信号
PHP1.CN | 中国最专业的PHP中文社区 | PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | PHP问答
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved PHP1.CN 第一PHP社区 版权所有