IPC通信:Posix消息队列的创建,关闭,删除
2012-04-16 09:13
351 查看
消息队列可以认为是一个链表。进程(线程)可以往里写消息,也可以从里面取出消息。一个进程可以往某个消息队列里写消息,然后终止,另一个进程随时可以从消息队列里取走这些消息。这里也说明了,消息队列具有随内核的持续性,也就是系统不重启,消息队列永久存在。
创建(并打开)、关闭、删除一个消息队列
编译并执行:
编译这个程序需要注意几点:
1、消息队列的名字最好使用“/”打头,并且只有一个“/”的名字。否则可能出现移植性问题;(还需保证在根目录有写权限,为了方便我在root权限下测试)
2、创建成功的消息队列不一定能看到,使用一些方法也可以看到,本文不做介绍;
消息队列的名字有如此规定,引用《UNIX网络编程 卷2》的相关描述: mq_open,sem_open,shm_open这三个函数的第一个参数是
一个IPC名字,它可能是某个文件系统中的一个真正存在的路径名,也可能不是。Posix.1是这样描述Posix IPC名字的。
1)它必须符合已有的路径名规则(最多由PATH_MAX个字节构成,包括结尾的空字节)
2)如果它以斜杠开头,那么对这些函数的不同调用将访问同一个队列,否则效果取决于实现(也就是效果没有标准化)
3)名字中的额外的斜杠符的解释由实现定义(同样是没有标准化) 因此,为便于移植起见,Posix IPC名字必须以一个斜杠打头,并且不能再包含任何其他斜杠符。
创建(并打开)、关闭、删除一个消息队列
#include <stdio.h> #include <stdlib.h> #include <mqueue.h> //头文件 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #define MQ_NAME ("/tmp") #define MQ_FLAG (O_RDWR | O_CREAT | O_EXCL) // 创建MQ的flag #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) // 设定创建MQ的权限 int main() { mqd_t posixmq; int rc = 0; /* 函数说明:函数创建或打开一个消息队列 返回值:成功返回消息队列描述符,失败返回-1,错误原因存于errno中 */ posixmq = mq_open(MQ_NAME, MQ_FLAG, FILE_MODE, NULL); if(-1 == posixmq) { perror("创建MQ失败"); exit(1); } /* 函数说明:关闭一个打开的消息队列,表示本进程不再对该消息队列读写 返回值:成功返回0,失败返回-1,错误原因存于errno中 */ rc = mq_close(posixmq); if(0 != rc) { perror("关闭失败"); exit(1); } /* 函数说明:删除一个消息队列,好比删除一个文件,其他进程再也无法访问 返回值:成功返回0,失败返回-1,错误原因存于errno中 */ rc = mq_unlink(MQ_NAME); if(0 != rc) { perror("删除失败"); exit(1); } return 0; }
编译并执行:
root@linux:/mnt/hgfs/C_libary# gcc -o crtmq crtmq.c /tmp/ccZ9cTxo.o: In function `main': crtmq.c:(.text+0x31): undefined reference to `mq_open' crtmq.c:(.text+0x60): undefined reference to `mq_close' crtmq.c:(.text+0x8f): undefined reference to `mq_unlink' collect2: ld returned 1 exit status 因为mq_XXX()函数不是标准库函数,链接时需要指定;库-lrt; root@linux:/mnt/hgfs/C_libary# gcc -o crtmq crtmq.c -lrt root@linux:/mnt/hgfs/C_libary# ./crtmq 最后程序并没有删除消息队列(消息队列有随内核持续性),如再次执行该程序则会给出错误信息: root@linux:/mnt/hgfs/C_libary# ./crtmq 创建MQ失败: File exit(0)
编译这个程序需要注意几点:
1、消息队列的名字最好使用“/”打头,并且只有一个“/”的名字。否则可能出现移植性问题;(还需保证在根目录有写权限,为了方便我在root权限下测试)
2、创建成功的消息队列不一定能看到,使用一些方法也可以看到,本文不做介绍;
消息队列的名字有如此规定,引用《UNIX网络编程 卷2》的相关描述: mq_open,sem_open,shm_open这三个函数的第一个参数是
一个IPC名字,它可能是某个文件系统中的一个真正存在的路径名,也可能不是。Posix.1是这样描述Posix IPC名字的。
1)它必须符合已有的路径名规则(最多由PATH_MAX个字节构成,包括结尾的空字节)
2)如果它以斜杠开头,那么对这些函数的不同调用将访问同一个队列,否则效果取决于实现(也就是效果没有标准化)
3)名字中的额外的斜杠符的解释由实现定义(同样是没有标准化) 因此,为便于移植起见,Posix IPC名字必须以一个斜杠打头,并且不能再包含任何其他斜杠符。
相关文章推荐
- IPC通信:Posix消息队列读,写
- 【IPC通信】Posix消息队列的属性设置
- IPC通信:Posix消息队列的属性设置
- IPC--消息队列 message queue --msgctl 函数(创建 删除 查看 综合运用)
- IPC通信:Posix消息队列的属性设置
- linux下Posix消息队列的创建和删除
- IPC通信:Posix消息队列
- IPC通信:Posix消息队列读,写
- IPC通信:Posix消息队列的属性设置
- IPC通信:Posix消息队列
- linux基础编程:进程通信之System V IPC:消息队列,信号量,共享内存
- Linux进程通信IPC--消息队列MessageQueue
- Linux进程通信之POSIX消息队列
- 管道、消息队列、共享内存几种IPC通信,简单的代码
- Unix IPC之Posix消息队列(3)
- linux IPC 通信 study 四:POSIX消息队列
- Linux进程通信之POSIX消息队列
- Posix 消息队列的创建问题
- 笔记六:进程间的通信(IPC通信之消息队列)
- IPC--消息队列 message queue --msgctl函数(删除指定msqid的消息队列)