linux消息队列通信

IPC机制

进程间通信机制(Inter Process Communication,,IPC),这些IPC机制的存在使UNIX在进程通信领域手段相当丰富,也使得程序员在开发一个由多个进程协作的任务组成的系统时,可以采用多种方法。这些高级IPC机制可分为以下三类:消息传递.信号量.共享存储。

信息传递构造一个消息队列,进程间通过发送消息和接收信息进行通信。

消息实质上就是一些字或字节的序列(未必以空字符结尾)。它通过消息队列的方法在进程间传递。。

进程间通信通过IPC对象,每个IPC对象都有唯一的ID号,通信双方需要获取该ID,创建者通过创建函数可以得到该值,可是另外的进程不能随意访问创建者的空间,于是约定利用相同的KEY值对于相同的ID,

系统为每一个IPC对象保存一个ipc_perm结构体,该结构说明了IPC对象的权限和所有者,每一个版本的内核各有不用的ipc_perm结构成员。若要查看详细的定义请参阅文件<sys/ipc.h>。

ipc_perm 结构定义于/usr/include/bits/ipc.h中,原型如下: struct ipc_perm{ key_t key; //关键字 uid_t uid; /*共享内存所有者的有效用户ID */ gid_t gid; /* 共享内存所有者所属组的有效组ID*/ uid_t cuid; /* 共享内存创建 者的有效用户ID*/ gid_t cgid; /* 共享内存创建者所属组的有效组ID*/ unsigned short mode; /* Permissions + SHM_DEST和SHM_LOCKED标志*/ unsignedshort seq; /* 序列号*/};

Ftok函数:

系统建立IPC通讯(如消息队列、共享内存时)必须指定一个ID值。通常情况下,该id值通过ftok函数得到。ftok原型:ftok(char *pathname, int projid)参数:pathname:文件名(含路径),通常设置为当前目录“.” 比如projid为’a’,则为”./a”文件projid:项目ID,必须为非0整数(0-255).

其实它就是用来实现从文件名到关键值的映射。

(一)msgsnd函数:

功能: 进程利用它来向消息队列发送消息。

函数声明: int msgsnd ( int msqid, struct msgbuf *msgp, int msgsz, int msgflg )返回值: 调用成功:返回0值;调用失败: -1

参数介绍:

第一个参数msqid: 是消息队列对象的标识符(由msgget()函数得到),

第二个参数msgp : 指向要发送的消息所在的内存,

第三个参数msgsz: 是要发送信息的长度(字节数),可以用以下的公式计算:(msgsz = sizeof(struct mymsgbuf) – sizeof(long);)第四个参数:是控制函数行为的标志,可以取以下的值:0,忽略标志位;IPC_NOWAIT:如果消息队列已满,消息将不被写入队列,控制权返回调用函数的线程。如果不指定这个参数,线程将被阻塞直到消息被可以被写入。

(二)msgget()函数:

功能: 用来创建新的消息队列或获取已有的消息队列。

函数声明: int msgget ( key_t key, int msgflg )返回值: 调用成功:消息队列的标识符;调用失败: -1:

参数介绍:

第一个参数key: 消息队列对象的关键字(key),函数将它与已有的消息队列对象的关键字进行比较来判断消息队列对象是否已经创建。

第二个参数msgflg:msgflg 控制函数具体操作。它可以取下面的几个值:IPC_CREAT :如果消息队列对象不存在,则创建之,否则则进行打开操作;IPC_EXCL: 和IPC_CREAT 一起使用(用”|”连接),如果消息对象不存在则创建之,否则产生一个错误并返回-1。

除了以上的两个标志以外,在msgflg 标志中还可以有存取权限控制符。这种控制符的意义和文件系统中的权限控制符是类似的。

(三)msgrcv()函数:

功能:用来从消息队列中取出消息。函数声明: int msgrcv ( int msqid, struct msgbuf *msgp, int msgsz, longmtype,int msgflg )返回值: 调用成功:从消息队列里拷贝过来的字节数;调用失败:返回-1;

参数介绍:

函数的前三个参数和msgsnd()函数中对应的参数的含义是相同的。

第四个参数mtype:

指定了函数从队列中所取的消息的类型。函数将从队列中搜索类型与之匹配的消息并将之返回。如果mtype 的值是零的话,函数将不做类型检查而自动返回队列中的最旧(优先级最小的)的消息。第五个参数依然是是控制函数行为的标志,取值可以是: 0,表示忽略;

MSG_NOERROR,如果函数取得的消息长度大于msgsz,将只返回msgsz 长度的信息, 剩下的部分被丢弃了。如果不指定这个参数,E2BIG 将被返回,而消息则留在队列中不被取出。 IPC_NOWAIT,如果消息队列为空,则返回一个ENOMSG,并将控制权交回调用函数的进程。如果不指定这个参数,那么进程将被阻塞直到函数可以从队列中得到符合条件的消息为止。如果一个client 正在等待消息的时候队列被删除,EIDRM 就会被返回。如果进程在阻塞等待过程中收到了系统的中断信号,EINTR 就会被返回。

(注意:当消息从队列内取出后,相应的消息就从队列中删除了。)

msgctl()函数:

功能:直接控制消息队列的行为。

函数声明: int msgctl ( int msgqid, int cmd, struct msqid_ds *buf )返回值:调用成功就返回0;失败就返回-1

参数介绍:

失败是什么?没有什么.只是更走近成功一步,

linux消息队列通信

相关文章:

你感兴趣的文章:

标签云: