av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

Linux下的消息隊(duì)列msgrcv實(shí)現(xiàn)及應(yīng)用 (linux消息隊(duì)列msgrcv)

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

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

一、消息隊(duì)列的概念

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

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

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

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

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

“`

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

“`

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

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

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

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

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

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

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

– MSG_NOERROR:如果消息長(zhǎng)度超過msgsz,則被截?cái)唷?/p>

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

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

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

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

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

“`

#include

#include

#include

#include

#define MSG_KEY 0x12345678

int mn()

{

int msgid;

struct msgbuf {

long mtype;

char mtext[256];

} message;

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

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)建了一個(gè)消息隊(duì)列,并通過msgsnd函數(shù)向消息隊(duì)列中發(fā)送了一條消息。

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

“`

#include

#include

#include

#include

#define MSG_KEY 0x12345678

int mn()

{

int msgid;

struct msgbuf {

long mtype;

char mtext[256];

} message;

// 連接消息隊(duì)列

msgid = msgget(MSG_KEY, 0666);

if (msgid == -1) {

perror(“msgget”);

exit(EXIT_FLURE);

}

// 從隊(duì)列中讀取消息

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ù)打開消息隊(duì)列,并通過msgrcv函數(shù)從消息隊(duì)列中讀取了一條消息,并輸出消息內(nèi)容。

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

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

1. 電商系統(tǒng)

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

2. 銀行系統(tǒng)

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

3. 物流系統(tǒng)

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

五、

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

  • 如何在linux下看消息隊(duì)列是否存在

如何在linux下看消息隊(duì)列是否存在

#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)隊(duì)列字節(jié)數(shù):%d\n,msg_info.msg_cbytes);

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

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

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

printf(接收消息進(jìn)程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,測(cè)試消息,sizeof(測(cè)試消息));

ret = msgsnd(msg_id, &msg_mbuf, sizeof(測(cè)試消息), 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)

{

/* 父進(jìn)程 */

/* 建立共享內(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消息隊(duì)列msgrcv的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux消息隊(duì)列msgrcv,Linux下的消息隊(duì)列msgrcv實(shí)現(xiàn)及應(yīng)用,如何在linux下看消息隊(duì)列是否存在的信息別忘了在本站進(jìn)行查找喔。

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


新聞名稱:Linux下的消息隊(duì)列msgrcv實(shí)現(xiàn)及應(yīng)用 (linux消息隊(duì)列msgrcv)
網(wǎng)站鏈接:http://uogjgqi.cn/article/coegceh.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流