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

分享mq_open函数

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
1 R' D# q, l3 J4 v9 u5 l
NAME( j) A# n1 n+ Y; n$ U! n) }
mq_open - 打开一个消息队列 (REALTIME). `( ?/ U! F* s6 v8 j" A. _2 o

5 r1 C! k0 Y% ~0 E& e7 |% w
! [6 x9 x% _$ jSYNOPSIS( ]+ f3 m( q$ P. u1 r) j

( ]9 c# p7 V0 b1 \6 l
  • #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
    1 P' e2 k, `. T) l9 R! q

/ o0 k% }# l: D. z3 L
! h2 u* e# O+ R4 Y% @/ f: QDESCRIPTION
: i+ [( {3 ]5 X
0 o$ |/ H" ?- N! w, \. X3 Umq_open() 函数会通过一个消息队列描述符(类型是mqd_t)建立一个进程与一个消息队列的连接.) x9 \6 M: |0 E7 U& B

; C# c9 B' q/ Z% q9 o- L该函数会创建一个打开的消息队列的描述符, 其他函数就可以通过这个描述符操作消息队列.
3 e' `$ ^! u+ B7 j
; n1 L, l* a: Y; d: E& K" y3 N7 d8 Z
PARAMETERS# P5 w3 n% ?6 k! F

  h) A. e0 P) |5 w: `①name
6 n* e. w0 n4 {7 y$ S% t+ w$ k) w6 q参数 name 是一个指向消息队列名称的指针. 但是名字是否出现在文件系统中,是否对其他以路径名为参数的函数可见是未定义的.7 [& }7 J. _# L! a- G- o
, t" H1 P+ _) j* v9 r5 F! B6 w6 g
参数 name 的长度限制是由系统实现决定的(如何获取这个限制),不需要遵守路径名的限制 {PATH_MAX} 和 {NAME_MAX}.
$ g3 L- \/ B) c1 }! N" ~1 P7 Y: U* W
如果 name 参数以"/"字符开头, 只有name没有被删除,所有使用相同name值调用mq_open函数的线程,访问的都是同一个消息队列,
0 i- N- q# i; W
7 x5 [- s& j+ D" K, ^! a, [5 }1 |如果 name 参数不是以"/"字符开头,效果是由系统实现决定的.所以name参数一定要以"/"字符开头.$ D3 ^" v! U7 [+ g+ ~
2 c7 g9 S. a' X, f* R6 f

9 q; t# U( S, Z" P: r. W②oflag
. `/ V- D/ Q9 K/ m3 z: o0 F/ u' j
0 w" ^8 I. d, _& n参数 oflag 表示想要访问(receive/send)消息队列的方式.2 O5 w0 Y* ^! [  T0 E' [5 T

1 s) K& X% X0 l( a. j' ?参数 oflag 是由下列宏组合计算出来的, 注意必须包含前3个(访问模式) 中的一个:) Z/ P# m$ J8 a$ j( Y+ O
; l  i: N) p* g* J( o0 @; T
O_RDONLY (只读)+ n/ Q" f: }6 O
& ^! f8 P4 Z! L0 z
打开一个消息队列用来接受消息.7 w! }5 @' K, `% i* I

6 |& [1 |8 x5 H调用进程可以使用mq_open返回的描述符用于函数 mq_receive(), 但是不能用于函数 mq_send().1 j, S) [$ F7 z7 W, a# E9 c
& J8 ]7 i% ?7 G4 w4 E, L4 |9 j
一个消息队列可以在相同或不同的进程中多次打开用来接收消息.
1 B3 [) t0 w8 ]0 T; |* X
3 b. }: h) H/ ?* u! M7 n. eO_WRONLY (只写)
" N! Y% }1 I: `6 H. v* {8 ~# Y9 B% u/ y
打开一个消息队列用来发送消息.
2 [7 i# \5 f: |2 J% @6 u1 A) E& \$ z
调用进程可以使用mq_open返回的描述符用于函数 mq_send(), 但是不能用于函数 mq_receive().7 J. }7 O, N5 w

' y4 i% k6 Q+ s& N6 Q+ W  P一个消息队列可以在相同或不同的进程中多次打开用来发送消息.( x: x3 b+ a2 y. `

: b7 n8 @3 b; a) ~% ]O_RDWR (读写)0 D& Q% r0 Q1 h3 ^4 [: x' L/ [

: a* ?  ~4 ?/ G' b& o5 k$ m+ }6 n打开一个消息队列用即可用来发送消息也可以用来接受消息.
- g4 }' Z. X8 T9 J3 A+ A) P5 F" r
8 V! p* I. b7 g' P5 u8 S调用进程可以使用任何支持O_RDONLY 和O_WRONLY 访问模式的函数.- ]* v# d, A& g7 b8 ^, J
4 A' P: _. A/ v9 m& m
一个消息队列可以在相同或不同的进程中多次打开用来发送消息.
  ^7 N6 a! I9 h4 b" h, g- B% H4 @# l' p* y6 p* Q/ h# _! X# p

9 Y  k2 w$ h# n! P1 m4 J0 Q, O. p( L0 ~$ B
Any combination of the remaining flags may be specified in the value of oflag:0 i6 T/ D# G% g) I# W, O
  r1 S/ [, ]" g! a) i& a
+ A9 z4 G* R& S: I
O_CREAT (创建)
2 `+ [+ f! v3 Z0 }, [
1 e7 r* ]5 i  C( `创建一个消息队列. 使用这个参数需要追加2个参数: ③mode(类型是mode_t), 和④attr(类型是mq_attr*).# Q, ~( W$ [; _. K) R
如果name参数指定的消息队列已经存在, 那么这个参数将不起任何作用, 除非像下面 O_EXCL 中提到的情况;' S2 M- Y7 S$ s& t% y. Q+ D
否则, 会创建一个空的消息队列. 消息队列的用户ID会被设置成这个进程的实际的用户ID.4 W- D, b! t8 ?( a0 r" |
消息队列的组ID会被设置成这个进程的实际的组ID; 然而, 如果参数name 指向的消息队列在文件系统中可见, 那么组ID会被设置成包含消息队列的目录的组ID.
& C5 h$ U0 \- P如果参数mode中的位与文件权限中位不同,这种情况是未定义的.
, c$ \2 u. M) b* w6 U如果 attr 是 NULL, 创建的消息队列是系统实现的默认属性. 如果 attr 不是 NULL 并且调用进程对参数name指定的文件有特定的权限(什么权限),
6 D3 H5 y3 ]3 Z& x9 P+ X& G那么消息队列的属性 mq_maxmsg 和 mq_msgsize 会被设置成 attr 中的属性. 属性 mq_flags 和 mq_curmsgs 会被忽略.3 W* L0 r. y+ l
如果 attr 不是 NULL , 并且调用进程对参数name指定的文件没有特定的权限,函数 mq_open() 会返回失败,不会创建消息队列.
/ G5 G# O  a& u! z) o8 `. ?  e7 Y- U5 }) P, y2 F' q9 w) f  \

/ a0 E: l9 m2 i9 |8 D9 SO_EXCL (既存检查)- {4 R9 B& @0 \/ c- ^5 i

2 Z( _; y4 f+ L- U( ?8 v4 @6 O如果 O_EXCL 和O_CREAT同时被设置了, 如果消息队列应经存在,那么函数 mq_open() 会返回失败.! o5 y! {1 \, O/ ^! I
提供了检查消息队列是否存在的方法, 如果设置了 O_EXCL 必须同时设置 O_CREAT 否则结果未定义.  Y, O/ O, i% N

1 \/ J9 j  `4 B1 A1 r$ U% oO_NONBLOCK (非阻塞)
2 y8 d9 B3 ~3 @3 V4 H$ k& m9 s2 i9 Z+ \8 O0 V0 a: Q3 R
决定函数 mq_send() 和 mq_receive() 在获取当前无法获得的资源或消息时,是一直等待(阻塞), 还是返回失败并将 errno 设置成 [EAGAIN];
1 Z7 y- S% T  G. c / ^- |4 T" Y4 @5 j
. f. K' P: V; H! B
RETURN VALUE2 q/ A# i0 w6 `# u' @# `

& f, k( h3 y" ?! x- m/ B如果函数执行成功, 函数返回一个描述符, q5 M) U. N* u1 g- }* M
0 a; F2 `& r0 R$ F
如果函数执行失败,函数返回 (mqd_t)-1 并且设置errno,errno的种别详见下面的ERRORS一节.
7 N4 E) h  V/ N& Q3 s5 v' j! ?$ C8 ]
7 N% g6 H7 S9 F. Q: u. `
1 d; I3 Q( r4 \! a2 p2 N7 u+ ?1 a& c9 ^2 Y9 g' @
ERRORS- g( j9 t. V3 r! ~

# o" a0 v' S0 }' ]5 h$ T[EACCES]
' n2 d  T5 D  I) L& C% j: c) Z2 @7 R. ^1 m  T
The 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.
+ b% M! V" C0 }7 F+ z- b
2 P, f) L2 `- m[EEXIST]% q6 c0 b$ U: E
7 K1 P( L% e' e  B
O_CREAT and O_EXCL are set and the named message queue already exists.
! X3 R, j' g4 ~7 b1 o- z6 r1 D% w8 k3 s0 e, K) [- w: S
[EINTR]
2 U* k2 s' w2 I4 N; h! [3 }- C/ M' e+ `: {1 E: [
函数 mq_open() 被信号中断.! R6 P+ t. L9 k7 C7 q; p' i
$ e& c- M7 `  L2 ^9 s
[EINVAL]0 L2 l; ^4 S+ ~1 _7 @' i0 r
& Q4 a% n" J9 \9 Y7 |4 w
函数 mq_open() 不支持参数name指定的路径.
2 G- |, n% T3 w$ v& O# \
4 v+ W$ m+ Z# t4 H, q[EINVAL]
! K+ x, A, f% t5 \  f2 D: E. g
' N- y. W9 m7 p设置了O_CREAT标志, 参数3 attr 不是NULL;并且 mq_maxmsg 或 mq_msgsize 小于等于0.2 z! p! ]) m* j/ j% o3 d
2 q$ v5 c/ N# M6 X2 c3 A
[EMFILE]
4 o- H* b2 d: g2 J( @  g; q. g  N0 R/ [* ^* u
本进程中使用了过多的消息队列描述符 或 文件描述符.& b8 \0 h: c' B7 A% {

2 H. v# a3 r# e[ENFILE]5 ?6 k- _! z( x% Y8 D
& L: X% f, q& |: l& U
系统中打开的消息队列数目超过了系统支持的最大数.0 l- ~- Y& {9 C; q8 c

. C, k- e5 F; J5 N[ENOENT]
* I  J: U3 f! V2 h/ q
9 B: T3 T3 h# v没有设置O_CREAT标志,并且指定的消息队列不存在.
* l! A' X; D/ r1 K# T+ h- s+ W1 ]( Y; D9 Z" r( n; q
[ENOSPC]
* H& R. F/ I9 m
, B/ a- E: X( c$ q3 Q1 d5 }空间不足,无法创建新的消息队列.. t2 k- S) T; p9 E7 J

5 J0 i2 f2 q! u4 K- L[ENAMETOOLONG]) p5 Z$ r, s; O5 k( l- f+ Y

, D6 p$ Y9 W  \1 z1 |7 n4 v参数 name 的长度超过系统定义的最大长度.
, n  H: a8 _& X/ c. [" L
" l* I) E0 _2 x: ?. G% s在不支持XSI系统中,name 的长度超过了 {_POSIX_PATH_MAX},在支持XSI系统中,name 的长度超过了 {_XOPEN_PATH_MAX};或者
$ Q# ~; y! Q% y$ B# K5 |% X: f% r$ F  @% l/ o% Z  v' N
在不支持XSI系统中,某一级路径的长度超过了 {_POSIX_NAME_MAX},在支持XSI系统中,某一级路径的长度超过了 {_XOPEN_NAME_MAX};' R3 q% j5 p+ {0 m5 C' U; H! R

1 k1 i, q4 k. b3 zEXAMPLES
- B! ]; T3 I) t4 L+ x

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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