LINUX进程控制(2)
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){ |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |