Posted on 2011-06-15 20:10
赞劲小子 阅读(490)
评论(0) 编辑 收藏 引用 所属分类:
Linux编程
1.指定共享文件:如/etc/shm/shmtest 此处shmtest需要自己建立;
2.创建IPC通讯ID值:key=ftok(char * fname,int id),fname就时你指定的文件名,id是子序号,值为1-255之间。
3.shmget 获取shm_id:shm_id = shmget(key,4194304,IPC_CREAT);此处需注意:4194304为你所分配的共享内存的 大小,单位为Byte,这里分配了4M,这个大小在你第 一次分配后,即运行shmget后,没有删除这个shmget之前就不不能增大了,只能改小,如果 你在未删除shm_id之前,将此处内存改大,编译会通过,但是在运行时会报错: shmget error: Invalid argument。因而, 若需要修改大小(增大内存),最好在shmat后增加一句删除shm_id的语句:shmctl(shm_id,IPC_RMID,0);这样每次都是申 请的 新的。若你不想删除shm_id而又想扩大共享内存的话,可以修改ftok中的id参数,这样会得到不同的key,也相当于重新申请了一个 shm_id,而原来的shm_id会一直存在直到 reboot。
4.读写操作中ftok对同一指定文件须使用相同的id,这样所得到的key才是相同的,不然会出现如下错误:shmget error: Invalid argument。
第一条很重要。这个文件确实需要自己来创建。我在做这块的一个小测试的时候没手动在磁盘的这个路径下穿件文件,也没在程序里创建shmtes这个文件,结 果在程序运行的时候在出错处理中就perror出了错误。但是我写的一个简单的测试程序运行结果还对,原因我不是很清楚。忘高手指点!!
剩下的几点没什么好说的了,上面已经很详细了!找个测试程序手动的编辑一下各种问题都会暴漏!出去面试的哥们,谁要被问到进程间通信方式的问题的时候,可别光说管道和socket了,消息队列和共享内存使他们想要的!