linux基礎程式設計 訊息佇列 msgsnd

2021-06-07 16:10:39 字數 3624 閱讀 6756

實際上,訊息佇列常常儲存在鍊錶結構中。擁有許可權的程序可以向訊息佇列中寫入或讀取訊息。

訊息佇列本身是非同步的,它允許接收者在訊息傳送很長時間後再取回訊息,這和大多數通訊協議是不同的。例如www中使用的http協議是同步的,因為客戶端在發出請求後必須等待伺服器回應。然而,很多情況下我們需要非同步的通訊協議。比如,乙個程序通知另乙個程序發生了乙個事件,但不需要等待回應。但訊息佇列的非同步特點,也造成了乙個缺點,就是接收者必須輪詢訊息佇列,才能收到最近的訊息。

和訊號相比,訊息佇列能夠傳遞更多的資訊。與管道相比,訊息佇列提供了有格式的資料,這可以減少開發人員的工作量。但訊息佇列仍然有大小限制。

包含檔案

1、msg.c

2、msg.h

3、thread.c

原始檔1 msg.c

#include #include #include #include #define __debug

#ifdef __debug

#define dbg(fmt,args...) fprintf(stdout, fmt, ##args)

#else

#define dbg(fmt,args...)

#endif

#define err(fmt,args...) fprintf(stderr, fmt, ##args)

/*訊息佇列初始化

msgkey:訊息佇列鍵值

qid:返回值,訊息佇列id

*/int msg_init( int msgkey )

dbg("msg queue id:%d\n",qid);

return qid;}/*

殺死訊息佇列

qid:訊息佇列id

*/int msg_kill(int qid)

原始檔2 msg.h

#ifndef _m_msg_h_

#define _m_msg_h_

/*訊息佇列鍵值*/

#define msg_key 0x12345

/*訊息型別定義

通過訊息型別接收特定組的訊息

而不是訊息佇列上的所以訊息都接收

*/enum ; /*

用於傳送接收的訊息buf

*/typedef struct _msg_bufmsg_buf;

int msg_init(int msgkey);

int msg_kill(int qid);

#endif

/*

訊息佇列示例,一般來說,訊息對用術語ipc中的一種,

既然能用用於多程序通訊,當然也可以用在單程序中的多執行緒中,

而且,當成語複雜度提公升後,多執行緒中使用訊息佇列也非常的方便

*/#include #include #include #include #include #include #include "msg.h"

#define __debug

#ifdef __debug

#define dbg(fmt,args...) fprintf(stdout, fmt, ##args)

#else

#define dbg(fmt,args...)

#endif

#define err(fmt,args...) fprintf(stderr, fmt, ##args)

static int isthreadquit = 0;

int gqid;//訊息佇列id

int gmyprocid = msg_type_msg1;

/*某裝置寫操作,不同同時訪問,所以所以需要執行緒鎖保護

1、將函式devicewrite中加鎖

2、在訪問devicewrite的執行緒中加鎖

以上兩種方法跟據需要選擇其一。

本例中在訪問的執行緒中加鎖

*/void devicewrite(char *str)

void setxxthreadquit()

void *xxmanagethread(void *arg)

/*arg是將指標帶進來,cmd則相反,或者設定 null*/

pthread_exit(cmd);

//pthread_exit(null);

}void *xxmanagethreadmutex(void *arg)

dbg("msgrcv cmd = %d\n",msg.cmd);

sleep(1);

}/*arg是將指標帶進來,cmd則相反,或者設定 null*/

pthread_exit(cmd);

//pthread_exit(null);

}int xxmanagethreadinit()

ret = pthread_create(&tmanagethreadmutex,null,xxmanagethreadmutex,"2 thread");

if(ret == -1)

/*設定執行緒退出時資源的清理方式,如果是detach,退出時會自動清理

如果是join,則要等待pthread_join呼叫時才會清理

*/ pthread_detach(tmanagethread);

pthread_detach(tmanagethreadmutex);

//pthread_join(tmanagethread,retn);

//dbg("retn value=%s\n",retn);

return 0;

}#define test_main

#ifdef test_main

int main()

while(count--)

setxxthreadquit();

/*等待執行緒結束*/

sleep(1);

/*清理訊息佇列*/

msg_kill(gqid);

dbg("waitting thread exit...\n");

return 0;

}#endif

執行結果:

[root@localhost src]# ./a.out 

hello liuyu

create msg queue id:65536

msg queue id:65536

[0] main running

arg value=1 thread

msgsnd cmd = 0

arg value=2 thread

msgrcv cmd = 0

msgsnd cmd = 1

msgrcv cmd = 1

[0] main running

msgsnd cmd = 2

msgrcv cmd = 2

msgsnd cmd = 3

msgrcv cmd = 3

[0] main running

msgsnd cmd = 4

msgrcv cmd = 4

msgsnd cmd = 5

msgrcv cmd = 5

kill queue id:65536

waitting thread exit...

Linux 訊息佇列程式設計

訊息佇列 訊號量以及共享記憶體被稱作 xsi ipc,它們均來自system v的ipc功能,因此具有許多共性。鍵和識別符號 核心中的每一種ipc結構 比如訊號量 訊息佇列 共享記憶體 都用乙個非負整數的識別符號加以標示 如共享記憶體的shmid 訊號量的semid 以及訊息佇列的msgid 不同於...

linux訊息佇列 Linux訊息佇列

訊息佇列,unix的通訊機制之一,可以理解為是乙個存放訊息 資料 容器。將訊息寫入訊息佇列,然後再從訊息佇列中取訊息,一般來說是先進先出的順序。可以解決兩個程序的讀寫速度不同 處理資料速度不同 系統耦合等問題,而且訊息佇列裡的訊息哪怕程序崩潰了也不會消失。最簡單的訊息記憶體的使用流程 ftok函式生...

linux程式設計 程序通訊 訊息佇列

訊息佇列是訊息的鏈式佇列 1 建立訊息佇列 include include include int msgget key t key,int msg 2 訊息佇列屬性控制 int msgctl int msqid,int cmd,struct msqid ds buf 3 傳送資訊到訊息佇列 int...