system v訊息佇列msgsnd函式
阿新 • • 發佈:2018-12-14
/*msgsnd函式將一個訊息新增到訊息佇列*/ //第一個引數為訊息佇列的標示符msgid //第二個引數為指標,只想準備傳送的訊息 //第三個為指標,指向訊息長度 //第四個為控制著當前訊息佇列滿或到達系統上限時將要發生的事情 #include <unistd.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #define ERR_EXIT(m) do \ { \ perror(m); \ exit(EXIT_FAILURE); \ }while(0) //第四個引數msgflg = IPC_NOWAIT表示佇列滿不等待,返回EAGAIN錯誤 //訊息結構體,一方面大小需小於系統限制MSGMAX,另外需以long/int長整形開始 /*訊息結構體*/ struct msgbuf{ long mtype;//佔四個位元組 char mtext[1]; } /* ./msg_send 8192 2 */ //從前向後讀引數存入argv[1],argv[2]..... int main(int argc, char* argv[]) { if(argc != 3) { fprintf(stderr, "Usage: %s <bytes> <type>\n", argv[0]); exit(EXIT_FAILURE); } int len = atoi(argv[1]);//8192訊息長度 int type = atoi(argv[2]);//讀2為訊息型別 int msgid; msgid = msgget(1234, 0666 | IPC_CREAT | IPC_EXCL); msgid = msgget(1234, 0);//0可以開啟任何許可權的訊息佇列,只打開不建立 if(msgid == -1) { ERR_EXIT("msgget"); } printf("msgget success\n"); struct msgbuf *ptr;//訊息結構體 ptr = (struct msgbuf*)malloc(sizeof(long)+len); ptr->mtype = type;//mtext未設定,即傳送任意訊息 if(msgsnd(msgid, ptr, len, 0)<0)//當訊息大於限制時,阻塞傳送 { ERR_EXIT("msgsnd"); } return 0; }