UNIX域套接字輪詢XSI訊息佇列

2021-07-11 04:27:27 字數 2240 閱讀 8560

unix域套接字用於在同一臺計算機上執行的程序之間的通訊。這點比用網際網路域套接字效率更高。因為unix域套接字僅僅複製資料,並不執行協議處理,不要新增或刪除網路報頭,無需計算校驗和, 不要產生順序號,無需傳送確認報文。 unix域套接字提供流和資料報兩種介面。unix域資料報服務是可靠的,既不會丟失報文,也不會傳遞出錯。unix域套接字就像是套接字和管道的混合。可以使用它們面向網路的域套接字介面或使用socketpair函式建立一對無命名的、相互連線的unix域套接字。

#include 

int socketpair(int domain, int type, int protocol, int sockfd[2]);

返回值: 若成功,返回0; 若出錯,返回-1

一對相互連線的unix域套接字可以起到全雙工通道的作用:兩端對讀寫都開放。

訊息佇列是xsi ipc三種方式之一(其他兩個:訊號量、共享儲存)。每個核心中的ipc結構都用乙個非負整數的識別符號加以引用。例如, 要向乙個訊息佇列傳送訊息或者從乙個訊息佇列取訊息,只需要知道其佇列識別符號。與檔案描述符不同,ipc識別符號不是小的整數。 當乙個ipc結構被建立時,與這種結構相關的識別符號連續加1,直至達到乙個整型數的最大正值,然後又迴轉到0。

識別符號是ipc物件的內部名。為使多個合作程序能夠在同一ipc物件上匯聚,提供了乙個外部命名方案。 每個ipc物件都與乙個鍵相關聯,將這個鍵作為該物件的外部名。當建立乙個新ipc結構時,都應該指定乙個鍵,這個鍵的資料型別是基本系統資料型別key_t.

但是,訊息佇列不能關聯到檔案描述符,這就限制了它不能和poll或select函式一起使用。然而,套接字是和檔案描述符相關聯的,訊息到達時,可以用套接字來通知。對每乙個訊息佇列使用乙個執行緒。每個執行緒都會在msgrcv呼叫中阻塞。當訊息到達時,執行緒會把它寫入乙個unix域套接字的一端。當poll指示套接字可以讀資料時,應用程式會使用這個套接字的另一端接收訊息。

// 17-3.c

//使用unix域套接字輪詢 xsi訊息佇列

#include "apue.h"

#include "myerror.h"

#include

#include

#include

#include

#define nq 3 /* number of queues */

#define maxmsz 512 /* maximum message size */

#define key 0x123 /* key for first message queue */

struct threadinfo;

struct mymesg;

void *helper(void *arg)

}int main()

for (;;)}}

exit(0);

}

在main函式中建立了一些訊息佇列和unix域套接字,並為每個訊息佇列開啟了乙個執行緒。然後它在乙個無線迴圈中用poll來論詢選擇乙個套接字端點。當某個套接字可讀時,程式從套接字中讀取資料並把訊息列印到標準輸出上。

//給xsi訊息佇列傳送訊息

//程式需要兩個引數: 訊息佇列關聯的鍵值以及乙個包含訊息主體的字串。

#include "apue.h"

#include "myerror.h"

#include

#define maxmsz 512

struct mymesg;

int main(int argc, char *argv)

key = strtol(argv[1], null, 0);

if ((qid = msgget(key,0)) < 0)

err_sys("can't open queue key %s", argv[1]);

memset(&m, 0, sizeof(m));

strncpy(m.mtext, argv[2], maxmsz-1);

nbytes = strlen(m.mtext);

m.mtype = 1;

if (msgsnd(qid, &m, nbytes, 0) < 0)

err_sys("can't send message");

exit(0);

}

unix域套接字 IPC

沒用過域套接字,一般都用管道來進行程序通訊,不過聽說域套接字比管道好。就試試吧。域套接字在socket函式建立的時候,第二個字段,可以是sock stream,也可以是sock dgram。可是在用sock dgram建立接收端的時候,我發現,它可以不用listen和accept過程,直接接收就可以...

UNIX域套接字程式設計

unix 域套接字 uds unix domain socket。unix域協議並不是乙個實際的協議族,而是在單個主機上執行客戶 伺服器通訊的一種方式,單個主機上執行通訊,也就是所謂的進行間通訊 ipc 所以unix域套接字協議可以視作ipc方法之一。unix域提供兩中套接字api 位元組流套接字 ...

利用Unix域套接字實現IPC

寫完後,至少除錯了30分鐘時間。錯誤1 snprintf argsockfd,sizeof argsockfd d sockfd 1 snprintf argmode,sizeof argmode d mode 寫作 snprintf argsockfd,sizeof argsockfd s soc...