快速业务通道

LINUX进程控制(2)

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

  char szBuf[]="written by child3\n";

  fdFifo=open("MyFifo",O_RDONLY);

  if(fdFifo<0){

  perror("Child3 open fifo fail");

  return -1;

  }

  if(read(fdFifo,&fdFile,sizeof(fdFile))<1){

  perror("read fifo fail");

  return -2;

  }

  close(fdFifo);

  write(fdFile,szBuf,strlen(szBuf));

  close(fdFile);

  return 0;

  }

  //Child3.cpp}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}

  5. 进程间通信(Interprocess Communication,IPC)

  5.1. 无名5.2. 管道(PIPE)

  pipe可以看作一个形似管子的文件,管子的一端写数据进去,另外一段读数据出来.无名管道通常用于有继承关系的两进程间传递数据,pipe是半工的,只能是一个进程传递数据给另外一个进程.

  管道函数原型:

  #include <unistd.h>

  int pipe(int fds[2]);

  管道在程序中用一对文件描述符表示,其中一个文件描述符有可读属性,一个有可写的属性.

  函数pipe用于创建一个无名管道,如果成功,fds[0]存放可写的文件描述符,fds[1]存放可写文件描述符,并且返回0,否则返回-1.

  通过调用pipe获取这对打开的文件描述符后,一个进程就可以往fds[0]中写数据,而另一个进程就可以从fds[1]中读数据出来了.当然两进程间有继承关系,才能继承这对打开的文件描述符. 拥有帝国一切,皆有可能。欢迎访问phome.net

  管道不象真正的物理文件,不是持久的,即两进程终止后,管道也自动消失了.

  示例:

  #include <stdio.h>

  #include <string.h>

  #include <unistd.h>

  int main()

  {

  int fds[2];

  int iRet;

  char szBuf[32];

  //

  pipe(fds);

  printf("fds[0]:%d fds[1]:%d\n",

  fds[0],fds[1]);

  if(fork()==0){

  close(fds[1]);

  iRet=read(fds[0],szBuf,sizeof(szBuf));

  if(iRet>0){

  szBuf[iRet]=0;

  printf("ps %d read:%s\n",getpid(),szBuf);

  }else{

  printf("read ret:%d\n",iRet);

  }

  close(fds[0]);

  }else{

  close(fds[0]);

  strcpy(szBuf,"Hello,child ps.");

  iRet=write(fds[1],szBuf,strlen(szBuf));

  printf("ps %d wrote:%s\n",getpid(),szBuf);

  close(fds[1]);

  }

  return 0;

  }

  管道两端的关闭是有先后顺序的,如果先关闭写端,则从另一端读数据时,read函数将返回0,表示管道已经关闭;

  但是如果先关闭写端,则往另一端写数据是,将会使写数据的进程接收到SIGPIPE信号,如果写进程不对该信号进行处理,将导致写进程终止,如果写进程处理了该信号,则写数据的write函数返回一个负值,表示管道已经关闭.

  示例:

  #include <signal.h>

  #include <stdio.h>

  #include <string.h>

  #include <unistd.h>

  int main()

  {

  int fds[2];

  int iRet;

  char szBuf[32];

  //

  /*注释掉这部分将导致写进程被信号SIGPIPE终止

  sigset_t setSig;

  sigemptyset(&setSig);

  sigaddset(&setSig,SIGPIPE);

  sigprocmask(SIG_BLOCK,&setSig,NULL);

  */

  pipe(fds);

  if(fork()==0){

  close(fds[1]);

  close(fds[0]);

  }else{

  close(fds[0]);

  usleep(1*1000);

  strcpy(szBuf,"Hello,child ps."); 拥有帝国一切,皆有可能。欢迎访问phome.net

  iRet=write(fds[1],szBuf,strlen(szBuf));

  if(iRet<0){

  print

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号