Linux进程间通讯.ppt_第1页
Linux进程间通讯.ppt_第2页
Linux进程间通讯.ppt_第3页
Linux进程间通讯.ppt_第4页
Linux进程间通讯.ppt_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux进程间通讯,Linux IPC概述,信号(signal):亲缘进程和非亲缘进程都可以, 也可以进程自己给自己递送信号。 信号量(semaphore):主要是线程间和亲缘进程间的同步手段,不做数据传输之用。 命名信号量:可以在非亲缘进程间使用。 管道:只允许亲缘进程间的通讯。 命名管道(FIFO):除了亲缘进程可以通讯外,非亲缘进程也可以通讯。,Linux IPC概述,共享内存:多个进程可以访问同一块内存空间,是最快的IPC方式。在进程间传递数据时无须任何内存的拷贝 。 套接字:最通用的进程间通讯方式,它提供了一种让不同机器上进程间通讯方式。,管道,管道是半双工的,当需要双向通讯时,需要两个管道。 只能用于父子进程和兄弟进程等有亲缘关系的进程。 数据写入时,放在管道的结尾。 数据读取时,从管道的头开始读取。,管道,#include int pipe(int pipefd2); pipe用来创建一个管道,这个管道用于父子进程间的通讯。pipefd0是管道的读端,pipefd1是管道的写端。 由于管道是单向的,所有一个进程需要关闭写端或者读端。 写端不存在时,读端会收到文件结束符。读端不存在时,写端会收到SIGPIPE信号。 成功返回0,失败返回-1. 缺点:只能用于亲缘进程间通讯。,命名管道(FIFO),命名管道可以在所有进程间使用,克服了管道只能在亲缘进程通讯的限制。 命名管道与一个路径名相关联,以文件的形式存在于文件系统中。只要能访问该文件的进程就可以使用命名管道。 命名管道也是先进先出,虽然以文件形式实现单不支持seek等操作。,创建FIFO,#include #include int mkfifo(const char * pathname, mode_t mode) 第一个参数为路径名,第二个为创建类型。跟create函数的参数一样。 进程只要打开这个文件,就可以往这个文件读和写。 当多个进程往fifo里写时,linux只保证PIPE_BUF大小的字节数是原子的。 成功返回0,失败返回-1。,popen,#include FILE *popen(const char *command, const char *type); int pclose(FILE *stream); popen的作用相当于创建一个管道,然后再fork一个子进程,最后执行命令。根据命令的不同这个管道是读的或者写的。 失败返回NULL,共享内存,共享内存是操作系统把同一块物理内存映射到不同进程的地址空间。 效率高,无须拷贝 。 多个进程可以自由读写共享内存,所以需要同步机制。 mmap shmget、shmat、shmdt、shmctl,mmap,void* mmap ( void * addr , size_t len , int prot , int flags , int fd , off_t offset ) mmap在进程地址空间创建一个映射。它既可以把一个文件映射到内存,也可以映射一块内存,实现进程间内存共享。 addr为共享内存的起始地址,为NULL时,内核会自动选择一个起始地址。length为共享内存的长度。 prot指明了共享内存保护状态:PROT_EXEC,PROT_READ,PROT_WRITE,PROT_NONE flags MAP_SHARED 共享此内存,MAP_PRIVATE 只有该进程可见。MAP_ANONYMOUS为匿名映射。,系统v共享内存,有内核维护共享内存 共享内存一旦建立,一直保留在系统中。直到系统重启或者共享内存被移除。 ipcs命令可以查看共享内存,信号量等。,系统v共享内存,#include #include #include int shmget(key_t key, size_t size, int shmflg); void *shmat(int shmid, const void *shmaddr, int shmflg); int shmdt(const void *shmaddr); int shmctl(int shmid, int cmd, struct shmid_ds *buf); key_t ftok(const char *pathname, int proj_id); ftok生成一个key,作为shmget的第一个参数。pathname必须为调用进程可以访问的。 proj_id的低8bit有效。pathname和proj_id共同组成一个key。,系统v共享内存,shmget 用来获取指定size的共享内存。第一个参数用来标识共享内存,第二个参数为共享内存的大小,第三个参数shmflg有IPC_CREAT和IPC_EXCL,最为重要的是在shmflg中指明访问权限,跟open的mode参数一样。否则会出现permission denied等错误。 失败返回-1。,系统v共享内存,shmat 把共享内存映射到进程空间。第一个参数为shmget的返回值,第二个参数可以为NULL,意味着有内核来选择映射的地址,第三个为映射到进程空间时共享内存的权限。 shmdt解除进程对共享内存的映射。 shmctl控制

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论