日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 线程同步消息队列,Linux 多线程同步之消息队列

發(fā)布時(shí)間:2025/3/15 linux 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 线程同步消息队列,Linux 多线程同步之消息队列 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

消息隊(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)先出

①msgget,創(chuàng)建一個(gè)新隊(duì)列或打開一個(gè)現(xiàn)有隊(duì)列

#include

int msgget ( key_t key, int flag );

//成功返回消息隊(duì)列ID;錯(cuò)誤返回-1

②msgsnd: 發(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:%s\n", strerror(errno));

exit(1);

}

if((msgid=msgget(key, IPC_CREAT | 0666/*PERM*/))==-1)

{

fprintf(stderr,"Creat Message? Error:%s\n", 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 = %d\n", 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:%s\n", 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 string\n", argv[0]);

exit(1);

}

/*

char path[256];

sprintf( path, "%s/", (char*)getenv("HOME") );

printf( "path is %s\n", path );

msgid=ftok( path, IPCKEY );

*/

if((key=ftok(MSG_FILE,'a'))==-1)

{

fprintf(stderr,"Creat Key Error:%s\n", strerror(errno));

exit(1);

}

if((msgid=msgget(key, IPC_CREAT | 0666/*PERM*/))==-1)

{

fprintf(stderr,"Creat Message? Error:%s\n", strerror(errno));

exit(1);

}

pthread_create( &tid, NULL, thr_test, &msgid );

fprintf(stderr,"msid is :%d\n", msgid);

msg.mtype = 1;

strncpy(msg.buffer, argv[1], BUFFER);

msgsnd(msgid, &msg, sizeof(struct msgtype), 0);

exit(0);

}

總結(jié)

以上是生活随笔為你收集整理的linux 线程同步消息队列,Linux 多线程同步之消息队列的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。