Linux多线程同步消息队列
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多线程中线程资源的释放