system v訊息佇列實現回射客戶 伺服器

2021-09-02 23:45:18 字數 1260 閱讀 7988

/*可能存在死鎖狀態:當客戶端傳送資料給伺服器,

伺服器回射訊息時,訊息佇列被多個客戶端同時傳送的大量訊息填滿,

伺服器無法回射,形成死鎖

/* server.c */

#include #include #include #include #include #include #include #include #define err_exit(m)

do \

while(0)

#define msgmax 8192

//訊息結構體,一方面大小需小於系統限制msgmax,另外需以long/int長整形開始

/*訊息結構體*/

struct msgbuf

void echo_srv(int msgid)

int pid;

pid = *((int*)msg.mtext);//讀取訊息中的mtext的前四個位元組

fputs(msg.mtext+4, stdout);//前四個位元組為型別號,只列印後面的訊息

msg.mtype = pid;//將程序號作為訊息型別號

msgsnd(msgid, &msg, n, 0);

memset(&msg, 0, sizeof(msg)); }}

int main(int argc, char* argv)

printf("msgget success\n");

echo_srv(msgid);

return 0;

}/*client.c*/

#include #include #include #include #include #include #include #include #define err_exit(m)

do \

while(0)

#define msgmax 8192

//訊息結構體,一方面大小需小於系統限制msgmax,另外需以long/int長整形開始

/*訊息結構體*/

struct msgbuf

void echo_cli(int msgid)

fputs(msg.mtext+4, stdout);

memset(msg.mtext+4, 0,msgmax-4); }}

int main(int argc, char* argv)

printf("msgget success\n");

echo_cli(msgid);

return 0;

}

System V訊息佇列

該函式用於建立乙個新的訊息佇列或訪問乙個已存在的訊息佇列,返回乙個整數識別符號。當建立乙個新的訊息佇列時,msqid ds結構的如下成員被初始化 msg perm結構的uid和cuid成員被設定成當前程序的有效使用者id,gid和cgid成員被設定成當前程序的有效id oflag中的讀寫許可權位存放...

SystemV訊息佇列

從乙個程序傳送資料到另外乙個程序。傳送的是資料塊,這個稱為訊息,訊息有型別,有邊界。每條訊息的最大長度有限制 msgmax 位元組 root localhost cat proc sys kernel msgmax 8192 每個訊息佇列的總位元組數有上限 msgmnb 位元組 root local...

system v 訊息佇列(二)

1 功能 把一條訊息新增到訊息佇列中 2 原型 intmsgsnd int msqid,const void msgp.size t msgsz,int msg 3 引數 msgqid 由msgget函式返回的訊息佇列標識碼 msgp 是乙個指標,指標指向準備傳送的訊息 msgsz 是msgp指向的...