Linux多線程同步之消息隊(duì)列 |
發(fā)布時(shí)間: 2012/8/10 10:26:20 |
消息隊(duì)列是消息的鏈表,存放在內(nèi)核中并有消息隊(duì)列標(biāo)示符標(biāo)示。
msgget用于創(chuàng)建一個(gè)新隊(duì)列或打開一個(gè)現(xiàn)存的隊(duì)列。msgsnd將新消息加入到消息隊(duì)列中;每個(gè)消息包括一個(gè)long型的type;和消息緩存;msgrcv用于從隊(duì)列中取出消息;取消息很智能,不一定先進(jìn)先出 、賛sgget,創(chuàng)建一個(gè)新隊(duì)列或打開一個(gè)現(xiàn)有隊(duì)列 #include int msgget ( key_t key, int flag ); //成功返回消息隊(duì)列ID;錯(cuò)誤返回-1 、趍sgsnd: 發(fā)送消息 #include int msgsnd( int msgid, const void* ptr, size_t nbytes, int flag ) //成功返回0,錯(cuò)誤返回-1 a: flag可以指定為IPC_NOWAIT; 若消息隊(duì)列已滿,則msgsnd立即出錯(cuò)返回EABAIN; 若沒指定IPC_NOWAIT; msgsnd會(huì)阻塞,直到消息隊(duì)列有空間為止 ③msgrcv: 讀取消息: ssize_t msgrcv( int msgid, void* ptr, size_t nbytes, long type, int flag ); a. type == 0; 返回消息隊(duì)列中第一個(gè)消息,先進(jìn)先出 b. type > 0 返回消息隊(duì)列中類型為tpye的第一個(gè)消息 c. type < 0 返回消息隊(duì)列中類型 <= |type| 的數(shù)據(jù);若這種消息有若干個(gè),則取類型值最小的消息 消息隊(duì)列創(chuàng)建步驟: #define MSG_FILE "." struct msgtype { long mtype; char buffer[BUFFER+1]; }; if((key=ftok(MSG_FILE,'a'))==-1) { fprintf(stderr,"Creat Key Error:%sn", strerror(errno)); exit(1); } if((msgid=msgget(key, IPC_CREAT | 0666/*PERM*/))==-1) { fprintf(stderr,"Creat Message Error:%sn", strerror(errno)); exit(1); } msg.mtype = 1; strncpy(msg.buffer, argv[1], BUFFER); msgsnd(msgid, &msg, sizeof(struct msgtype), 0); msgrcv(msgid, &msg, sizeof(struct msgtype), 1, 0); 示例代碼: #include #include #include #include #include #include #include #include #include #define MSG_FILE "." #define BUFFER 255 #define PERM S_IRUSR|S_IWUSR #define IPCKEY 0x111 struct msgtype { long mtype; char buffer[BUFFER+1]; }; void* thr_test( void* arg ){ struct msgtype msg; int msgid; msgid = *((int*)arg); printf("msqid = %d IPC_NOWAIT = %dn", msgid, IPC_NOWAIT); time_t tt = time(0)+8; //while( time(0) <= tt ) //{ msgrcv(msgid, &msg, sizeof(struct msgtype), 1, 0); fprintf(stderr,"Server Receive:%sn", msg.buffer); msg.mtype = 2; msgsnd(msgid, &msg, sizeof(struct msgtype), 0); //} pthread_exit( (void*)2 ); } int main(int argc, char **argv) { struct msgtype msg; key_t key; int msgid; pthread_t tid; if(argc != 2) { fprintf(stderr,"Usage:%s stringn", argv[0]); exit(1); } /* char path[256]; sprintf( path, "%s/", (char*)getenv("HOME") ); printf( "path is %sn", path ); msgid=ftok( path, IPCKEY ); */ if((key=ftok(MSG_FILE,'a'))==-1) { fprintf(stderr,"Creat Key Error:%sn", strerror(errno)); exit(1); } if((msgid=msgget(key, IPC_CREAT | 0666/*PERM*/))==-1) { fprintf(stderr,"Creat Message Error:%sn", strerror(errno)); exit(1); } pthread_create( &tid, NULL, thr_test, &msgid ); fprintf(stderr,"msid is :%dn", msgid); msg.mtype = 1; strncpy(msg.buffer, argv[1], BUFFER); msgsnd(msgid, &msg, sizeof(struct msgtype), 0); exit(0); } 本文出自:億恩科技【1tcdy.com】 服務(wù)器租用/服務(wù)器托管中國五強(qiáng)!虛擬主機(jī)域名注冊頂級提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |