IPC通訊 Posix訊息佇列的屬性設定

2021-09-08 16:07:52 字數 3241 閱讀 2754

posix訊息佇列的屬性使用如下結構存放:

struct

mq_attr

; 佇列可以在建立時由mq_open()函式的第四個引數指定mq_maxmsg,mq_msgsize。 如建立時沒有指定則使用預設值,一旦建立,則不可再改變。

佇列可以在建立後由mq_setattr()函式設定mq_flags

#include

/*取得訊息佇列屬性,放到mqstat地fh

*/int mq_getattr(mqd_t mqdes, struct mq_attr *mqstat);

/*設定訊息佇列屬性,設定值由mqstat提供,原先值寫入omqstat

*/int mq_setattr(mqd_t mqdes, const

struct mq_attr *mqstat, struct mq_attr *omqstat);

均返回:若成功則為0,若出錯為-1

程式獲取和設定訊息佇列的預設屬性:

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9

10#define mq_name ("/tmp")

11#define mq_flag (o_rdwr | o_creat | o_excl) //

建立mq的flag

12#define file_mode (s_irusr | s_iwusr | s_irgrp | s_iroth) //

設定建立mq的許可權

1314

intmain()

15

2829

//獲取訊息佇列的預設屬性

30 rc = mq_getattr(posixmq, &mqattr);

31if(-1 ==rc)

32

3637 printf("

佇列阻塞標誌位:%ld\n

", mqattr.mq_flags);

38 printf("

佇列允許最大訊息數:%ld\n

", mqattr.mq_maxmsg);

39 printf("

佇列訊息最大位元組數:%ld\n

", mqattr.mq_msgsize);

40 printf("

佇列當前訊息條數:%ld\n

", mqattr.mq_curmsgs);

4142 rc =mq_close(posixmq);

43if(0 !=rc)

44

4849 rc =mq_unlink(mq_name);

50if(0 !=rc)

51

55return

0;

56 }

編譯並執行:

1 root@linux:/mnt/hgfs/c_libary# gcc -o attrmq attrmq.c -lrt

2 root@linux:/mnt/hgfs/c_libary# ./attrmq

3 佇列阻塞標誌位:0

4 佇列允許最大訊息數:10

5 佇列訊息最大位元組數:8192

6 佇列當前訊息條數:0

7 root@linux:/mnt/hgfs/c_libary#

設定訊息佇列的屬性:

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9

10#define mq_name ("/tmp")

11#define mq_flag (o_rdwr | o_creat | o_excl) //

建立mq的flag

12#define file_mode (s_irusr | s_iwusr | s_irgrp | s_iroth) //

設定建立mq的許可權

1314

intmain()

15

3233 mqattr.mq_flags = 0

; 34 mq_setattr(posixmq, &mqattr, null);//

mq_setattr()只關注mq_flags,adw

3536

//獲取訊息佇列的屬性

37 rc = mq_getattr(posixmq, &mqattr);

38if(-1 ==rc)

39

4344 printf("

佇列阻塞標誌位:%ld\n

", mqattr.mq_flags);

45 printf("

佇列允許最大訊息數:%ld\n

", mqattr.mq_maxmsg);

46 printf("

佇列訊息最大位元組數:%ld\n

", mqattr.mq_msgsize);

47 printf("

佇列當前訊息條數:%ld\n

", mqattr.mq_curmsgs);

4849 rc =mq_close(posixmq);

50if(0 !=rc)

51

5556 rc =mq_unlink(mq_name);

57if(0 !=rc)

5862

63return

0;

64 }

編譯執行:

1 root@linux:/mnt/hgfs/c_libary# gcc -o setattrmq setattrmq.c -lrt

2 root@linux:/mnt/hgfs/c_libary# ./setattrmq

3 佇列阻塞標誌位:0

4 佇列允許最大訊息數:5

5 佇列訊息最大位元組數:8192

6 佇列當前訊息條數:0

IPC通訊 Posix訊息佇列的建立,關閉,刪除

訊息佇列可以認為是乙個鍊錶。程序 執行緒 可以往裡寫訊息,也可以從裡面取出訊息。乙個程序可以往某個訊息佇列裡寫訊息,然後終止,另乙個程序隨時可以從訊息佇列裡取走這些訊息。這裡也說明了,訊息佇列具有隨核心的持續性,也就是系統不重啟,訊息佇列永久存在。建立 並開啟 關閉 刪除乙個訊息佇列 1 inclu...

程序間通訊 posix 訊息佇列

posix訊息佇列 訊息佇列可以認為是乙個訊息鍊錶,某個程序往乙個訊息佇列中寫入訊息之前,不需要另外某個程序在該佇列上等待訊息的達到,這一點與管道和fifo相反。posix訊息佇列與system v訊息佇列的區別如下 對posix訊息佇列的讀總是返回最高優先順序的最早訊息,對system v訊息佇列...

程序間通訊 IPC 訊息佇列

訊息佇列是訊息的鏈結表,儲存在核心中,由訊息佇列識別符號標識。有足夠寫許可權的程序可往佇列中放置訊息,有足夠讀許可權的程序可從佇列中取走訊息。posix 和 system v 下的訊息佇列略有不同,主要體現在一下幾個方面 這裡我們以 posix 下的訊息隊列為例來進行講解。訊息佇列的建立 訊息佇列的...