通信行业-西安邮电大学Linux高级编程进程间通信 精品

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
可以把消息看作一个记录,具有特定的格式以及特定的优先 级。对消息队列有写权限的进程可以向消息队列中按照一定 的规则添加新消息;对消息队列有读权限的进程则可以从消 息队列中读取消息。
2021/8/6
11
消息队列属性
2021/8/6
12
消息struct msg结构体
//come from /usr/src/kernels/’uname –r’/inlcude/linux/msg.h /*one msg_msg structure for each message */ struct msg_msg{
2021/8/6
5
例:ftok的使用
#include <stdio.h> #include <sys/types.h> main(){
key_t key; key=ftok(".",1); printf("the key is %x\n",key); }
2021/8/6
人民邮电出版社出版 杨宗德编著
struct list_head m_list; long m_type; int m_ts; /*message test size */ struct msg_msgseg* next; void * security; /* the actual message follows immediately */ };
printf("file st_ino=%x\n",buf.st_ino);
printf("number=%x\n",i);
key=ftok(argv[1],i);
printf("key=0x%x ",key);}
2021/8/6
9
第5章 System V进程间通信
1
System V IPC基础
2
MODE 存取模式和许可权限的标记
OWNER and GROUP 登录名和用户属主的组号
2021/8/6
3
key值和ID值
Linux系统为每个IPC机制都分配了唯一的ID,所有针对该IPC 机制的操作都使用对应的ID。因此,通信的双方都需要通过 某个办法来获取ID值。显然,创建者根据创建函数的返回值 可获取该值,但另一个进程如何实现呢?由于Linux两个进程 不能随意访问对方的空间(一个特殊是,子进程可以继承父 亲进程的数据,实现父亲进程向子进程的单向传递),也就 不能够直接获取这一ID值。
消息队列
3
信号量通信机制
4
共享内存
消息队列的基本概念
消息队列就是一个消息的链表,是一系列保存在内核中的消 息的列表。用户进程可以向消息队列添加消息,也可以从消 息队列读取消息。
消息队列与管道通信相比,其优势是对每一个消息指定特定 消息类型,接收的时候不需要按队列次序,而是可以根据自 定义条件接收特定类型的消息。
2021/8/6
7
例:ftok函数和参数的关系
#include <sys/ipc.h> #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> main(int argc, char * argv[]){
key_t key; int i; struct stat buf; if(argc!=3) {
为解决这一问题,IPC在实现时约定使用key值做为参数创建, 如果在创建时使用相同的key值将得到同一个IPC对象的ID (即一方创建,另一方获取的是ID),这样就保证了双方可 以获取用于传递数据的IPC机制ID值。
2021/8/6
4
ftok
extern key_t ftok(__const char * __pathname, int __proj_id); 此函数有两个参数,pathname为文件路径名,可以是特殊 文件(例如目录文件),也可以是当前目录“.”,而通常也是 设置此参数为当前目录,因为当前目录一般都是存在的,且不会 被立即删除。第二个参数为一个int型变量。
第5章 System 础
2
消息队列
3
信号量通信机制
4
共享内存
为了提供与其他系统的兼容性,Linux也支持三种System V 的进程间通信机制:消息队列、信号量和共享内存,Linux对这 些机制的实施大同小异。
我们把信号量、消息队列和共享内存统称System V IPC对象。 就像每个文件都有一个打开文件号一样,每个对象也都有唯一 的识别号,进程可以通过系统调用传递的识别号来存取这些对 象。与文件的存取一样,对这些对象的存取也要验证存取权限, System V IPC可以通过系统调用对对象的创建者设置这些对象的 存取权限。
printf("error usage\n"); i=atoi(argv[2]);
2021/8/6
return 1; }
8
例:ftok函数和参数的关系
if((stat(argv[1],&buf))==-1) {
perror("stat");
exit(EXIT_FAILURE);
}
printf("file st_dev=%x\n",buf.st_dev);
6
ftok
ftok函数创建key值过程中使用了该文件属性的st_dev和 st_ino。具体构成如下: key值的第31-24为ftok()第二个参数的低8位; key值的第23-16为该文件的st_dev属性的低8位; key值的第15-0为该文件的st_ino属性的低16位;
因此,如果使用相同的文件路径及整数,得到的key值是唯 一的,而唯一的key值创建某类IPC机制时将得到同一个IPC机制 (但如果使用相同的key值分别创建一个消息队列和一个信号量, 两者没有联系),而文件路径的访问对两个进程来说很容易统一, 因此,便捷的实现了两进程通信机制的确定。
2021/8/6
2
ipcs 命令
Ipcs命令用于显示消息队列、共享内存、信号量的信息。
q 显示消息队列
s 显示信号量
m 显示共享内存 a 详细信息
对每一个资源,这个命令会显示:
TYPE 包括信息队列(q),共享内存(m),或者信号量(s)。
ID
资源条目的唯一的表示号
KEY 应用程序存取资源使用的参数。
相关文档
最新文档