- 1、本文档共81页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
6.3.3 共享内存 函数格式 函数的头文件如下所示。 #include sys/types.h #include sys/ipc.h #include sys/shm.h shmget函数的语法要点如下所示。 ? 函数原型 int shmget(key_t key, /*IPC_PRIVATE */ int size, /*共享内存区大小*/ int shmflg) /*同open函数的权限位,也可以用8进制表示法*/ ? 函数返回值 成功:共享内存段标识符 出错:-1 6.3.3 共享内存 函数格式 shmat函数的语法要点如下所示。 ? 函数原型 char *shmat( int shmid, /*要映射的共享内存区标识符*/ const void *shmaddr, /*将共享内存映射到指定位置(若为0则表示把该段共享内存映射到调用进程的地址空间)*/ int shmflg) /*SHM_RDONLY:共享内存只读。默认0,共享内存可读写*/ ? 函数返回值 成功:被映射的段地址 出错:-1 shmdt函数的语法如下所示。 ? 函数原型 int shmdt(const void *shmaddr) /*被映射的共享内存段地址*/ ? 函数返回值 成功:0 出错:-1 6.3.3 共享内存 使用实例 这里要介绍的一个命令是ipcs,这是用于显示进程间通信状态的命令。它可以查看共享内存、消息队列等各种进程间通信机制对象的情况,这里使用了system函数来调用命令ipcs,函数,如下所示: /*创建共享内存*/ shmget(IPC_PRIVATE,BUFSZ,0666); /*映射共享内存*/ shmat(shmid,0,0)); /*删除共享内存*/ shmdt(shmadd); 6.3.4 消息队列 消息队列概述 消息队列就是一个消息的链表。用户可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息,消息队列是随内核持续的。 6.3.4 消息队列 消息队列实现说明 消息队列的实现包括创建或打开消息队列、添加消息、读取消息和控制消息队列这4种操作。 ? 创建或打开消息队列 使用函数msgget,这里创建的消息队列的数量会受到系统消息队列数量的限制。 ? 添加到消息队列 使用函数msgsnd,它把消息添加到已打开的消息队列末尾。 ? 读取消息队列内容 使用函数msgrcv,它把消息从消息队列中取走,与FIFO不同的是,这里可以指定取走某一类型的消息。 ? 控制消息队列 使用函数msgctl,它可以完成多项功能。 6.3.4 消息队列 函数格式 用到的头文件如下所示: #include sys/types.h #include sys/ipc.h #include sys/shm.h msgget函数的语法要点如下所示 ? 函数原型 int msgget(key_t key, /*返回新的或已有队列的队列ID、IPC_PRIVATE */ int flag) ? 函数返回值 成功:消息队列ID 出错:-1 msgsnd函数的语法要点如下所示。 ? 函数原型 int msgsnd(int msqid, /*消息队列的队列ID */ const void *prt, /*指向消息结构的指针*/ size_t size, /*消息的字节数*/ int flag)/*有两种取值情况:IPC_NOWAIT若消息并没有立即发送而调用进程会立即返回。0:msgsnd调用阻塞直到条件满足为止*/ 6.2 Linux进程控制相关API 进程的创 建 exec函数族 (2)exec函数族语法 6.2 Linux进程控制相关API 进程的创 建 exec函数族 (3)exec函数组调用实例 使用execlp函数,采用逐个列举方式,并且使用系统默认的环境变量。 使用execl函数时需要给出完整的文件路径来查找对应的可执行文件。 if(fork()==0){ /*调用execlp函数,这里相当于调用了“ls -l”命令*/ if(execlp(ls,ls,-l,NULL)0) perror(execlp error!); } /*调用execl函数,注意这里要给出ls程序所在的完整路径*/ if(execl(
文档评论(0)