找回密码
 注册
关于网站域名变更的通知
查看: 576|回复: 1
打印 上一主题 下一主题

分享mq_open函数

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-4-27 10:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

7 v1 d  \) Q! w5 hNAME
4 {. l/ a# C1 y5 J- Rmq_open - 打开一个消息队列 (REALTIME)
9 g- @( |- C" v4 W9 z% |( N- n
9 H  Y+ P, P$ e: E& n$ |/ w1 G/ I* V& l8 B7 [( j! C6 Q% X" P$ q
SYNOPSIS* K% Y9 C# p7 v, x
9 ~0 Y7 e  C5 C  a- [8 z6 K
  • #include <mqueue.h>
  • mqd_t mq_open(const char *name, int oflag, ...)
  • mqd_t mq_open(const char *name, int oflag, mode_t mode, mq_attr* attr) //O_CREAT
    $ b6 x3 d7 R$ x/ F4 B* c

2 ~; }0 N% H1 t& ~' ?; B& o* k6 d4 U+ P  o/ y
DESCRIPTION0 i. U* h3 g& z

6 u. g5 \" u: T4 u' |  X7 C. Amq_open() 函数会通过一个消息队列描述符(类型是mqd_t)建立一个进程与一个消息队列的连接.; g: D& |0 Q6 X4 b0 ?* p5 y( g
3 W4 k$ k( m9 `# g$ r
该函数会创建一个打开的消息队列的描述符, 其他函数就可以通过这个描述符操作消息队列.' N* R( V, V' ?$ t4 [0 x
4 [9 W: i$ ~; `$ S

4 `; c5 G: d5 q1 \4 i% YPARAMETERS% D' b( n3 g5 Z

3 t* q! j, B( p3 Q' l  z2 v2 s①name
/ P- W# L& P" m& Y/ X/ K参数 name 是一个指向消息队列名称的指针. 但是名字是否出现在文件系统中,是否对其他以路径名为参数的函数可见是未定义的.( [4 w' d$ ^% ]. n
5 F& p) q5 d' Y) h' y' R
参数 name 的长度限制是由系统实现决定的(如何获取这个限制),不需要遵守路径名的限制 {PATH_MAX} 和 {NAME_MAX}./ L( P, q% ^% Q) ~3 y

5 J0 f  ^: S) s5 H如果 name 参数以"/"字符开头, 只有name没有被删除,所有使用相同name值调用mq_open函数的线程,访问的都是同一个消息队列,& s* H3 I, K, |# B: D
1 r5 o  i+ |. a
如果 name 参数不是以"/"字符开头,效果是由系统实现决定的.所以name参数一定要以"/"字符开头.
  D( l5 \2 S( f% F# i; l; b
1 K- j" @' A- B) @; i  }* p+ ?$ l, b  }
3 z% l/ r+ k0 z) g  f: C) h②oflag3 x3 \! w$ F! H  ?7 |# J2 Y+ S" d

& T9 A3 m6 ~4 n. S" J, t# i参数 oflag 表示想要访问(receive/send)消息队列的方式.6 q! `1 [) n( ^; ^: f4 J" [
; e0 d: B3 Z; l; ?
参数 oflag 是由下列宏组合计算出来的, 注意必须包含前3个(访问模式) 中的一个:
. T6 l& z2 e4 e+ E, ^# C& m9 g. \6 n3 x/ [$ W8 N; R3 @0 M0 q
O_RDONLY (只读), M3 R- v( \& ^# D
: ?* u' {7 z% S" p4 ~
打开一个消息队列用来接受消息./ k' J& o* g* `
4 [+ E! s5 E) M0 @" t$ L& R
调用进程可以使用mq_open返回的描述符用于函数 mq_receive(), 但是不能用于函数 mq_send().
' e. [- @1 t0 f, _  c- K* s8 {9 \" k
一个消息队列可以在相同或不同的进程中多次打开用来接收消息., \! [/ {8 ?' G) o6 f! ?3 O/ I7 t* x
+ c/ C  Q. @, c2 j1 `
O_WRONLY (只写)
' {& L' X; W' x2 S1 }4 z3 g* }; j; [8 n& Y4 P
打开一个消息队列用来发送消息.
4 D2 ^3 z& F, p6 i2 d% C$ b) I' p1 X) D' o
调用进程可以使用mq_open返回的描述符用于函数 mq_send(), 但是不能用于函数 mq_receive().
  n' J- `$ C* i" ~
  W, k, x  T1 {* L4 ]" u8 _9 [  P$ X一个消息队列可以在相同或不同的进程中多次打开用来发送消息.
5 C' m0 L+ H9 A$ |
& @$ p- d8 z1 k7 pO_RDWR (读写)3 n9 z% c! J5 G' {& a& F7 e: g
; V( \4 o2 L8 d9 M
打开一个消息队列用即可用来发送消息也可以用来接受消息.5 u) U! M$ t# }: A$ W8 L4 b, F4 {
8 S& I1 E4 `3 i
调用进程可以使用任何支持O_RDONLY 和O_WRONLY 访问模式的函数.
6 b1 Z  _4 k& Y) _- q
" c: m% n' c6 R$ E+ a3 s一个消息队列可以在相同或不同的进程中多次打开用来发送消息.6 Y7 i" t# R3 D1 ^/ z* X
# a- B4 s) P; o. M+ t) z% r: @9 Q

% h! ^/ y9 ]9 K: t% j( {& G+ S" A6 l; D( Z3 h
Any combination of the remaining flags may be specified in the value of oflag:
3 q, f1 v" k7 A1 S( A3 L; \9 B; o8 o# @* W  Q& s$ q1 z
4 c. t% \$ R' h8 c$ k
O_CREAT (创建)
: n7 l! `" b; n7 M9 b
6 I- S+ w9 h  |. k创建一个消息队列. 使用这个参数需要追加2个参数: ③mode(类型是mode_t), 和④attr(类型是mq_attr*).( w- `0 p5 p1 D
如果name参数指定的消息队列已经存在, 那么这个参数将不起任何作用, 除非像下面 O_EXCL 中提到的情况;/ T; E: g  @4 H" i5 z+ D
否则, 会创建一个空的消息队列. 消息队列的用户ID会被设置成这个进程的实际的用户ID.
% @0 W, }) h: n 消息队列的组ID会被设置成这个进程的实际的组ID; 然而, 如果参数name 指向的消息队列在文件系统中可见, 那么组ID会被设置成包含消息队列的目录的组ID.
& \9 I# q; S% c0 ?0 O如果参数mode中的位与文件权限中位不同,这种情况是未定义的. 2 k8 O' V# U0 |! t& y! @/ d
如果 attr 是 NULL, 创建的消息队列是系统实现的默认属性. 如果 attr 不是 NULL 并且调用进程对参数name指定的文件有特定的权限(什么权限),
" J* m( S0 r; k  f4 n' j那么消息队列的属性 mq_maxmsg 和 mq_msgsize 会被设置成 attr 中的属性. 属性 mq_flags 和 mq_curmsgs 会被忽略.9 R6 V3 H& N% j8 V2 J5 l: K
如果 attr 不是 NULL , 并且调用进程对参数name指定的文件没有特定的权限,函数 mq_open() 会返回失败,不会创建消息队列.6 N0 ^1 n/ }) Q, G) @
' a" m; g8 y1 c, |6 K9 p% C7 d, g" P) p

; n( b7 T1 |" X: P. n' pO_EXCL (既存检查)
, X/ V% ]9 h  w( k" Z/ V/ z! U7 q( E/ W* Z7 Q9 b
如果 O_EXCL 和O_CREAT同时被设置了, 如果消息队列应经存在,那么函数 mq_open() 会返回失败.0 K( P; Z4 w) t$ q5 a# S
提供了检查消息队列是否存在的方法, 如果设置了 O_EXCL 必须同时设置 O_CREAT 否则结果未定义.
- k7 u. [# v( _% G8 y
7 o) h- B+ I; Q9 x$ L1 bO_NONBLOCK (非阻塞)+ L& O5 Y- \0 S+ S

8 U: \# c9 ~' \6 A# `! Q决定函数 mq_send() 和 mq_receive() 在获取当前无法获得的资源或消息时,是一直等待(阻塞), 还是返回失败并将 errno 设置成 [EAGAIN]; - T1 P- L+ R) P# q. S- v5 F/ j
3 k5 k1 }+ c3 F- M5 X9 ^; ^3 g" @
6 `4 ?" J& I. q- V9 L1 i
RETURN VALUE
8 A  c, K# F- ]" ?
# m% h( U' v+ K8 }如果函数执行成功, 函数返回一个描述符
- _; i$ O/ Y7 B1 X8 h6 b
6 x4 Q7 J- Q! _3 c9 v* C如果函数执行失败,函数返回 (mqd_t)-1 并且设置errno,errno的种别详见下面的ERRORS一节.
9 c$ Z& I3 Q& F7 b& ~
, v1 j- W, O" i2 b : a, T3 K9 t; R9 M" j% i4 c9 `

; Z& M( j& r8 W# [, TERRORS# n0 p- i: j; k* G# b

* y! d' z# X9 ~! x, E& @7 }[EACCES]
7 s, m8 o9 f" r* I6 Q% Q* N
3 S& d/ i" s0 {* i! kThe message queue exists and the permissions specified by oflag are denied, or the message queue does not exist and permission to create the message queue is denied.4 G( y3 j0 ?/ H

1 m6 J5 L/ G! |8 r% Y5 d1 _% X7 ^[EEXIST]
) {8 B& l0 g$ `: ~- A0 ]; j
5 y1 u( N+ Z& l* F2 xO_CREAT and O_EXCL are set and the named message queue already exists.
/ ]# P' Q1 y3 q% j) x, w
, w9 E" x7 {7 L& U[EINTR]2 a. R2 [  @( |+ L  h9 z' w

# l! E1 j# W( _) U& L函数 mq_open() 被信号中断.
9 O' {5 \3 H; i; T) y* m% Q
/ p- R3 @- Q7 i1 Y2 C5 b+ r[EINVAL]5 u0 R8 U1 r2 o) n7 i

! n7 s  c. {2 D7 t函数 mq_open() 不支持参数name指定的路径.
+ C! q5 \! b" s" D; `! L  S
' U: I. n( o! t9 }! g/ b6 n0 s[EINVAL]8 N1 |7 J  ^' j
$ b3 d. f  f6 V/ B
设置了O_CREAT标志, 参数3 attr 不是NULL;并且 mq_maxmsg 或 mq_msgsize 小于等于0." q) P$ b" W) u' B% z& |; B3 b/ s9 ]* k

3 O5 T# E1 r& p- L[EMFILE]6 c4 m- ~# N1 `: }4 T! s

. y# p: g& {+ Q$ |" ?本进程中使用了过多的消息队列描述符 或 文件描述符.
- m' S: Y' M- f5 B& r# U7 ?. w6 T/ A  O6 x
[ENFILE]3 S! i6 [/ I9 n. j3 r. O: J
% M8 E5 O# X# V- r! j- a. ?
系统中打开的消息队列数目超过了系统支持的最大数.
1 S% }. _% c1 C- J) w& {
( E, [9 T8 w) }$ U* Z[ENOENT]$ i2 T* ~. t- ^! \! h! T' ^8 ^, ?
1 d/ H  j7 u' E8 X* {
没有设置O_CREAT标志,并且指定的消息队列不存在.3 }! ?1 t/ t8 x# ]. Z* Y

) D  d) j* A8 x& a6 S" x[ENOSPC]# b4 n6 b; d7 p

7 }/ C, F. \3 f2 C) O) O9 d$ c空间不足,无法创建新的消息队列.
+ ^7 {* O. H7 F, X3 X- y
, g9 C$ a* x: |6 h' W. R0 _[ENAMETOOLONG]
  s0 P$ v! H, I0 J" F' b" l- B! k
, p% Y+ [; U9 ]6 k/ b' l参数 name 的长度超过系统定义的最大长度.
# B5 b" W2 f2 h4 U7 h( g, A/ b2 m
在不支持XSI系统中,name 的长度超过了 {_POSIX_PATH_MAX},在支持XSI系统中,name 的长度超过了 {_XOPEN_PATH_MAX};或者7 |/ ?  I6 j3 W! ]

: i9 X9 c7 ~0 l  N. \在不支持XSI系统中,某一级路径的长度超过了 {_POSIX_NAME_MAX},在支持XSI系统中,某一级路径的长度超过了 {_XOPEN_NAME_MAX};; B1 b4 M8 P, J% L( i6 o  z
5 E  f; ~9 |4 m; K& f3 C7 C2 V
EXAMPLES7 X: \3 O# v4 I2 \7 W  y

该用户从未签到

2#
发表于 2021-4-27 10:56 | 只看该作者
分享mq_open函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 12:47 , Processed in 0.156250 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表