/*可能存在死鎖狀態:當客戶端傳送資料給伺服器,
伺服器回射訊息時,訊息佇列被多個客戶端同時傳送的大量訊息填滿,
伺服器無法回射,形成死鎖
/* 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指向的...