当前位置:硬件测评 > Linux多线程同步消息队列

Linux多线程同步消息队列

  • 发布:2023-09-29 12:27

msgget用于创建新队列或打开现有队列。msgsnd向消息队列添加新消息;每条消息包含一个长类型;和消息缓存; msgrcv 用于从队列中检索消息;检索消息很聪明,不一定是先进先出…… 消息队列是消息的链表,存储在内核中,并标有消息队列标识符。 msgget 用于创建新队列或打开现有队列。msgsnd向消息队列添加新消息;每条消息包含一个长类型;和消息缓存; msgrcv 用于从队列中检索消息;检索消息很智能,不一定是先进先出 ①msgget,创建新队列或打开现有队列 #包括 int msgget(key_t key, int flag); //成功返回消息队列ID;出错时返回-1 ②msgsnd:发信息 #包括 int msgsnd(int msgid, const void* ptr, size_t nbytes, int flag) //成功返回0,错误返回-1 a:该标志可以指定为IPC_NOWAIT;如果消息队列已满,msgsnd会立即出错并返回EABAIN; 如果未指定IPC_NOWAIT;msgsnd将阻塞,直到消息队列中有空间 ③msgrcv:读取消息: ssize_t msgrcv( int msgid, void* ptr, size_t nbytes, long 类型, int flag ); A。类型==0;返回消息队列中的第一条消息,先进先出 b. type > 0 返回消息队列中第一条类型为 tye 的消息 C。类型 消息队列创建步骤: #define MSG_FILE“。” 结构体消息类型{ 长mtype; 字符缓冲区[BUFFER+1]; }; if((key=ftok(MSG_FILE,'a'))==-1) { fprintf(stderr,"创建密钥错误:%s\n", strerror(errno)); 退出(1); } if((msgid=msgget(key, IPC_CREAT | 0666/*PERM*/))==-1) {fprintf(stderr,"创建消息错误:%s\n", strerror(errno)); 退出(1); } 消息.mtype = 1; strncpy(msg.buffer, argv[1], BUFFER); 另外(msgid, &msg, sizeof(struct msgtype), 0); msgrcv(msgid, &msg, sizeof(struct msgtype), 1, 0); 示例代码: #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #define   MSG_FILE“。” #定义缓冲区 255 #define   PERM S_IRUSR|S_IWUSR #定义IPCKEY 0x111 结构体消息类型{ 长mtype; 字符缓冲区[BUFFER+1]; }; 无效* thr_test( 无效* arg ){ 结构体消息类型消息; int msgid; msgid = *((int*)arg); printf("msqid = %d IPC_NOWAIT = %d\n", msgid, IPC_NOWAIT); time_t tt = 时间(0)+8; //同时(时间(0) //{ msgrcv(msgid, &msg, sizeof(struct msgtype), 1, 0); fprintf(stderr,"服务器接收:%s\n", msg.buffer); 消息.mtype = 2; 另外(msgid, &msg, sizeof(struct msgtype), 0); //} pthread_exit((void*)2); } int main(int argc, char **argv) { 结构体消息类型消息; key_t 键; int msgid; pthread_t tid; if(argc!= 2) {fprintf(stderr,"用法:%s 字符串\n", argv[0]); 退出(1); } /* 字符路径[256]; sprintf( 路径, "%s/", (char*)getenv("HOME") ); printf("路径是 %s\n", 路径 ); msgid=ftok( 路径, IPCKEY ); */ if((key=ftok(MSG_FILE,'a'))==-1) { fprintf(stderr,"创建密钥错误:%s\n", strerror(errno)); 退出(1); } if((msgid=msgget(key, IPC_CREAT | 0666/*PERM*/))==-1) { fprintf(stderr,"创建消息错误:%s\n", strerror(errno)); 退出(1); } pthread_create( &tid, NULL, thr_test, &msgid ); fprintf(stderr,"msid 是:%d\n", msgid); 消息.mtype = 1; strncpy(msg.buffer, argv[1], BUFFER); msgsnd(msgid, &msg, sizeof(struct msgtype), 0); 退出(0); } ​ 【编辑精选】 Linux多线程同步的命名管道 Linux多线程机制线程同步 Linux多线程中线程资源的释放

相关文章