日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Linux下的消息隊列msgrcv實現(xiàn)及應(yīng)用 (linux消息隊列msgrcv)

Linux操作系統(tǒng)是一種開源的操作系統(tǒng),被廣泛應(yīng)用于各種服務(wù)器和嵌入式設(shè)備中。在企業(yè)應(yīng)用中,消息隊列是一種常見的進程間通信方式,很多企業(yè)系統(tǒng)都是基于消息隊列實現(xiàn)各個模塊之間的數(shù)據(jù)傳輸和協(xié)調(diào)。Linux系統(tǒng)提供了一種稱為msgrcv的函數(shù)用于進程間消息隊列的接收和處理。本文將著重介紹。

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),靈寶企業(yè)網(wǎng)站建設(shè),靈寶品牌網(wǎng)站建設(shè),網(wǎng)站定制,靈寶網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,靈寶網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

一、消息隊列的概念

消息隊列是一種進程間通信方式,它是消息的鏈表,存放在內(nèi)核中。消息隊列中的每個消息都有一個消息類型和消息體。消息類型用于標識消息的用途,消息體則是真正的數(shù)據(jù)部分。

消息隊列是多個進程共享的一種數(shù)據(jù)結(jié)構(gòu),通過消息隊列,發(fā)送方可以把消息發(fā)送到消息隊列中,接收方則從消息隊列中讀取消息并進行處理。在使用消息隊列時,發(fā)送方和接收方可以是同一個進程,也可以是不同的進程。

二、msgrcv函數(shù)的實現(xiàn)

在Linux系統(tǒng)中,進程間通信的方式有多種,比如信號、管道、共享內(nèi)存等。消息隊列是其中一種較為高效的方式。在Linux系統(tǒng)中,進程通過定義特定的消息類型和消息內(nèi)容,將消息發(fā)送到消息隊列中,而通過msgrcv函數(shù)則可以從消息隊列中讀取并處理消息。

在Linux系統(tǒng)中,msgrcv函數(shù)是一個系統(tǒng)調(diào)用函數(shù),其完整定義如下:

“`

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msg);

“`

函數(shù)各參數(shù)含義如下:

msqid:消息隊列的標識符,它是通過msgget函數(shù)創(chuàng)建消息隊列后返回的一個值。

msgp:消息的接收緩沖區(qū)指針。調(diào)用msgrcv函數(shù)后,內(nèi)核將消息從消息隊列中讀取到該緩沖區(qū)中。

msgsz:接收緩沖區(qū)的大小,msgsz應(yīng)該至少等于消息長度。

msgtyp:指定所讀取消息的消息類型。其值為0時,可以讀取消息隊列中的之一條消息;否則,值為msgtyp的消息將被讀取。

msg:消息的接收方式。它可以取以下值:

– IPC_NOWT:如果消息隊列中沒有符合要求的消息,則返回-1,并將errno設(shè)置為ENOMSG。

– MSG_NOERROR:如果消息長度超過msgsz,則被截斷。

– MSG_EXCEPT:讀取類型為msgtyp以外所有類型的消息,而不是讀取類型為msgtyp的消息。

– MSG_COPY:讀取類型為msgtyp的消息時,內(nèi)核將消息從消息隊列中移除,并將其復(fù)制到msgp中,而不是返回一個指向緩沖區(qū)的指針。

三、msgrcv函數(shù)的使用

使用msgrcv函數(shù)可以很方便地從消息隊列中讀取并處理消息。下面是一個示例程序,通過msgrcv函數(shù)從消息隊列中讀取消息并輸出消息體的內(nèi)容。

創(chuàng)建消息隊列及發(fā)送消息:

“`

#include

#include

#include

#include

#define MSG_KEY 0x12345678

int mn()

{

int msgid;

struct msgbuf {

long mtype;

char mtext[256];

} message;

// 創(chuàng)建消息隊列

msgid = msgget(MSG_KEY, IPC_CREAT | 0666);

if (msgid == -1) {

perror(“msgget”);

exit(EXIT_FLURE);

}

// 發(fā)送消息

message.mtype = 1;

snprintf(message.mtext, 256, “Hello, world!”);

if (msgsnd(msgid, &message, sizeof(message), 0) == -1) {

perror(“msgsnd”);

exit(EXIT_FLURE);

}

return 0;

}

“`

上述程序使用msgget函數(shù)創(chuàng)建了一個消息隊列,并通過msgsnd函數(shù)向消息隊列中發(fā)送了一條消息。

下面是使用msgrcv函數(shù)讀取消息的示例程序:

“`

#include

#include

#include

#include

#define MSG_KEY 0x12345678

int mn()

{

int msgid;

struct msgbuf {

long mtype;

char mtext[256];

} message;

// 連接消息隊列

msgid = msgget(MSG_KEY, 0666);

if (msgid == -1) {

perror(“msgget”);

exit(EXIT_FLURE);

}

// 從隊列中讀取消息

if (msgrcv(msgid, &message, sizeof(message), 1, 0) == -1) {

perror(“msgrcv”);

exit(EXIT_FLURE);

}

printf(“Received message: %s\n”, message.mtext);

return 0;

}

“`

上述程序使用msgget函數(shù)打開消息隊列,并通過msgrcv函數(shù)從消息隊列中讀取了一條消息,并輸出消息內(nèi)容。

四、消息隊列的應(yīng)用場景

消息隊列廣泛應(yīng)用于各種企業(yè)系統(tǒng)中,例如電商系統(tǒng)、銀行系統(tǒng)、物流系統(tǒng)等。下面簡要介紹消息隊列在這些系統(tǒng)中的應(yīng)用場景。

1. 電商系統(tǒng)

在電商系統(tǒng)中,消息隊列可以用于記錄日志信息,并對于不同類型的操作建立不同的消息類型,例如訂單、庫存、日志等。消息隊列中的每條消息可以包含訂單編號、日志信息、庫存信息等,并通過消息隊列傳遞給其他模塊進行處理。

2. 銀行系統(tǒng)

在銀行系統(tǒng)中,消息隊列可以用于處理交易信息,例如客戶向銀行申請貸款、轉(zhuǎn)賬等操作。對于每個交易,銀行會對其進行處理并返回相應(yīng)的結(jié)果,所有的交易信息都可以通過消息隊列進行傳遞,提高交易處理的速度和效率。

3. 物流系統(tǒng)

在物流系統(tǒng)中,消息隊列可以用于處理訂單信息、運輸信息等。例如,每個訂單都會有一個唯一的訂單號,訂單信息會通過消息隊列傳遞給相應(yīng)的快遞員,快遞員在途中需要不斷更新訂單的狀態(tài),例如已發(fā)貨、已派送等。所有這些狀態(tài)信息都可以通過消息隊列進行交換和傳遞。

五、

相關(guān)問題拓展閱讀:

  • 如何在linux下看消息隊列是否存在

如何在linux下看消息隊列是否存在

#include

#include

#include

#include types.h>

#include msg.h>

#include

#include ipc.h>

void msg_show_attr(int msg_id, struct msqid_ds msg_info)

{

int ret = -1;

sleep(1);

ret = msgctl(msg_id, IPC_STAT, &msg_info);

if( -1 == ret)

{

printf(獲消息信息失敗\n);

return ;

}

printf(\n);

printf(現(xiàn)隊列字節(jié)數(shù):%d\n,msg_info.msg_cbytes);

printf(隊列消息數(shù):%d\n,msg_info.msg_qnum);

printf(隊列字節(jié)數(shù):%d\n,msg_info.msg_qbytes);

printf(發(fā)送消息進程pid:%d\n,msg_info.msg_lspid);

printf(接收消息進程pid:%d\n,msg_info.msg_lrpid);

printf(發(fā)送消息間:%s,ctime(&(msg_info.msg_stime)));

printf(接收消息間:%s,ctime(&(msg_info.msg_rtime)));

printf(變化間:%s,ctime(&(msg_info.msg_ctime)));

printf(消息UID:%d\n,msg_info.msg_perm.uid);

printf(消息GID:%d\n,msg_info.msg_perm.gid);

}

int main(void)

{

int ret = -1;

int msg_flags, msg_id;

key_t key;

struct msgmbuf{

int mtype;

char mtext;

};

struct msqid_ds msg_info;

struct msgmbuf msg_mbuf;

int msg_sflags,msg_rflags;

char *msgpath = /ipc/msg/;

key = ftok(msgpath,’a’);

if(key != -1)

{

printf(功建立KEY\n);

}

else

{

printf(建立KEY失敗\n);

}

msg_flags = IPC_CREAT;

msg_id = msgget(key, msg_flags|0666);

if( -1 == msg_id)

{

printf(消息建立失敗\n);

return 0;

}

msg_show_attr(msg_id, msg_info);

msg_sflags = IPC_NOWAIT;

msg_mbuf.mtype = 10;

memcpy(msg_mbuf.mtext,測試消息,sizeof(測試消息));

ret = msgsnd(msg_id, &msg_mbuf, sizeof(測試消息), msg_sflags);

if( -1 == ret)

{

printf(發(fā)送消息失敗\n);

}

msg_show_attr(msg_id, msg_info);

msg_rflags = IPC_NOWAIT|MSG_NOERROR;

ret = msgrcv(msg_id, &msg_mbuf, 10,10,msg_rfla

共享內(nèi)存示例代碼:

#include

#include sem.h>

#include ipc.h>

#include

typedef int sem_t;

union semun {

int val;

struct semid_ds *buf;

unsigned short *array;

} arg;

sem_t CreateSem(key_t key, int value)

{

union semun sem;

sem_t semid;

sem.val = value;

semid = semget(key,value,IPC_CREAT|0666);

if (-1 == semid)

{

printf(create semaphore error\n);

return -1;

}

semctl(semid,0,SETVAL,sem);

return semid;

}

/*

struct sembuf{

ushort sem_num;

short sem_op;

short sem_;

};

*/

void SetvalueSem(sem_t semid, int value)

{

union semun sem;

sem.val = value;

semctl(semid,0,SETVAL,sem);

return ;

}

int GetvalueSem(sem_t semid)

{

union semun sem;

return semctl(semid,0,GETVAL,sem);

return sem.val;

}

void DestroySem(sem_t semid)

{

union semun sem;

sem.val = 0;

semctl(semid,0,IPC_RMID,sem);

}

int Sem_P(sem_t semid)

{

struct sembuf sops={0,+1,IPC_NOWAIT};

return (semop(semid,&sops,1));

}

int Sem_V(sem_t semid)

{

struct sembuf sops={0,-1,IPC_NOWAIT};

return (semop(semid,&sops,1));

}

static char msg=共享內(nèi)存\n;

int main(void)

{

key_t key;

int semid,shmid;

char i,*shms,*shmc;

struct semid_ds buf;

int value = 0;

char buffer;

pid_t p;

key = ftok(/ipc/sem/,’a’);

shmid = shmget(key,1024,IPC_CREAT|0604);

semid = CreateSem(key,1);

p = fork();

if(p > 0)

{

/* 父進程 */

/* 建立共享內(nèi)存 */

shms = (char *)shmat(shmid,0,0);

memcpy(shms, msg, strlen(msg)+1);

sleep(10);

Sem_P(semid);

shmdt(shms);

DestroySem(semid);

}

else if(p == 0)

{

shmc = (char *)shmat(shmid,0,0);

Sem_V(semid);

printf(共享內(nèi)存值:%s\n,shmc);

linux消息隊列msgrcv的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于linux消息隊列msgrcv,Linux下的消息隊列msgrcv實現(xiàn)及應(yīng)用,如何在linux下看消息隊列是否存在的信息別忘了在本站進行查找喔。

成都服務(wù)器托管選創(chuàng)新互聯(lián),先上架開通再付費。
創(chuàng)新互聯(lián)(www.cdcxhl.com)專業(yè)-網(wǎng)站建設(shè),軟件開發(fā)老牌服務(wù)商!微信小程序開發(fā),APP開發(fā),網(wǎng)站制作,網(wǎng)站營銷推廣服務(wù)眾多企業(yè)。電話:028-86922220


網(wǎng)頁名稱:Linux下的消息隊列msgrcv實現(xiàn)及應(yīng)用 (linux消息隊列msgrcv)
鏈接URL:http://www.5511xx.com/article/coegceh.html