欢迎来到天天文库
浏览记录
ID:34614922
大小:1022.25 KB
页数:46页
时间:2019-03-08
《进程间通信new》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、进程间通信简介管道信号/信号集消息队列共享内存信号量为什么要使用IPC?›数据传输:一个进程需要将它的数据发送给另一个进程。›资源共享:多个进程之间共享同样的资源。›通知事件:一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件。›进程控制:有些进程希望完全控制另一个进程的执行,此时控制进程希望能够拦截另一个进程的所有操作,并能够及时知道它的状态改变。发展史:Linux下的进程间通信基本上是从Unix平台上的进程间通信继承而来的。SystemIPCUnixIPClinuxIPC基于socketIPCPosixIPCLinux进程间通信的
2、几种主要手段简介:›管道及有名管道›信号›消息队列›共享内存›信号量›套接口管道是linux支持的最初UnixIPC形式之一,具有以下特点:›管道是半双工的:数据只能向一个方向流动;›只能用于亲缘关系的进程之间;›单独构成一种独立的文件系统;›数据的读出和写入:进程每次向管道末尾写入数据,从管道头部读取数据。管道的创建函数:intpipe(intfd[2]);此函数调用成功返回0,否则返回-1;函数创建管道后,一般再fork一个子进程。如果只在一个进程中间,在实际应用中,没有太大意义。管道两端可分别用描述符fd[0]、fd[1]来描述,需要注意的是,管
3、道的两端是固定了任务的。即一端只能用于读,由描述符fd[0]表示,称为读端,另一端只用于写,由描述符fd[1]表述,称为写端。intmain(void){intfd[2];pid_tpid;charr_buf[128]={0};charw_buf[128]={0};if(pipe(fd)<0){printf("pipecreateerror.");return-1;}if((pid=fork())==0){close(fd[1]);sleep(3);//intr_num=0;r_num=read(fd[0],r_buf,sizeo
4、f(r_buf));printf("readnumis%d.",r_num);close(fd[0]);exit(0);}elseif(pid>0){close(fd[0]);strcpy(w_buf,"111");if(write(fd[1],w_buf,4)==-1)perror("writeerr.");close(fd[1]);printf("parentclosefd[1]over.");wait(NULL);}}从管道中读取数据:›如果管段的写端不存在,则认为已经读到了数据的末尾。›如果管道的写端存在时,如果请求的字
5、节数目大于PIPE_BUF,则返回管道中现有的数据字节数,如果请求的字节数目不大于PIPE_BUF,则返回管道中现有数据字节数(此时,管道中数据量小于请求的数据量);或者返回请求的字节数(此时,管道中数据量不小于请求的数据量)。intmain(){intfd[2];pid_tpid;charw_buf[8192];memset(w_buf,0,sizeof(w_buf));if(pipe(fd)<0){printf("pipecreateerror.");return-1;}if((pid=fork())==0){close(fd[0])
6、;close(fd[1]);sleep(5);exit(0);}elseif(pid>0){sleep(1);close(fd[0]);intn;if((n=write(fd[1],w_buf,1000))==-1)printf("writetopipeerror");elseprintf("write%dtopipe.",n);close(fd[1]);wait(NULL);}}向管道中写入数据:›向管道中写入数据时,若管道缓冲区一有空闲区域,写进程就会试图向管道写入数据。如果读进程不读走管道缓冲区中的数据,那么写操作将一直阻塞。
7、注意:只有在管道的读端存在时,向管道中写入数据才有意义。否则,向管道中写入数据的进程将收到内核传来的SIFPIPE信号,应用程序可以处理该信号,也可以忽略(默认动作则是应用程序终止)。利用管道实现父子进程间的双向通信。管道的主要局限性正体现在它的特点上:›只支持单向数据流;›只能用于具有亲缘关系的进程之间;›没有名字;›管道的缓冲区是有限的;›管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式,比如多少字节算作一个消息(或命令、或记录)等等;管道应用的一个重大限制是它没有名字。为了克服该限制,提出了有名管道(FIFO).FI
8、FO和管道
此文档下载收益归作者所有