Linux中进程间通信共享内存.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux中进程间通信共享内存

Linux给我们提供了丰富的内部进程通信机制,包括共享内存、内存映射文件、先入先出(FIFO)、接口(sockets)以及多种用于同步的标识。 ??? 一般来说,内部进程通信(interprocess communication)也就是IPC,是指两个或两个以上进程以及两个或者两个以上线程之间进行通信联系。每个IPC机制都有不同的强项或者弱点,不过没有一个IPC机制包含内建的同步方法。因此程序员不但需要自己在程序中实现同步,而且还需要为了利用IPC机制而自己开发通信协议。 共享内存 ----------------------------------------------------------- ??? 使用共享内存和使用malloc()来分配内存区域很相似。使用共享内存的方法是: ??? 1 对一个进程/线程使用shmget()分配内存区域。 ??? 2 使用shmat()放置一个或多个进程/线程在共享内存中,也可以用shmctl()来获取信息或者控制共享区域。 ??? 3 使用shmdt()从共享区域中分离。 ??? 4 使用shmctl()解除分配空间 ??? 共享内存是Linux中最快速的IPC方法。它也是一个双向过程,共享区域内的任何进程都可以读写内存。这个机制的不利方面是其同步和协议都不受程序员控制,必须确保将句柄传递给了子进程和线程。 例程 ----------------------------------------------------------- #include stdlib.h #include stdio.h #include string.h #include errno.h #include unistd.h #include sys/stat.h #include sys/types.h #include sys/ipc.h #include sys/shm.h #define PERM S_IRUSR|S_IWUSR int main(int argc, char **argv) { ??? key_t shmid; ??? char?? *p_addr, *c_addr; ??? pid_t pid; ??? if(argc != 2) { ??????? fprintf(stderr, Usage:%s\n\a, argv[0]); ??????? exit(1); ??? } ??? if( (shmid = shmget(IPC_PRIVATE, 1024, PERM)) == -1 )?? { //(1) ??????? fprintf(stderr, Create Share Memory Error:%s\n\a, strerror(errno)); ??????? exit(1); ??? } ??? pid = fork(); ??? if(pid 0) { ??????? p_addr = shmat(shmid, 0, 0); ??????? memset(p_addr, \0, 1024); ??????? strncpy(p_addr, argv[1], 1024); ??????? wait(NULL); ??????? exit(0); ??? } ??? else if (pid == 0){ ??????? sleep(1); ??????? c_addr = shmat(shmid, 0, 0); ??????? printf(Client get %s\n, c_addr); ??????? exit(0); ??? } } (1) IPC_PRIVATE??? ??? ??? 保证使用唯一ID S_IRUSR | S_IWUSR????? 使当前用户可以读写这个区域 运行 ----------------------------------------------------------- $ ./a.out zengxiaolong Client get zengxiaolong $ ./a.out zengxiaolong 后记: ??? 进程通信(IPC)是网络程序的基础,在很多的网络程序当中会大量的使用进程通信的概念和知识.其实进程通信是一件非常复杂的事情,我在这里只是简单的介绍了一下.如果你想学习进程通信的详细知识,最好的办法是自己不断的写程序和看联机手册.

文档评论(0)

qwd513620855 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档