程序04 訊息佇列

2021-10-24 23:24:28 字數 3045 閱讀 6550

建立訊息佇列:

1.建立ipc的通訊物件的key(金鑰) ftok

#include

#include

key_t ftok(const char *pathname, int proj_id);

引數1:選擇乙個路徑填入

引數2:隨意填入乙個整形資料

返回值:ftok()根據兩個引數生成一把金鑰

key_t key = ftok("/home/xc/io/3-sharememery", 123);

if(key == -1)

printf("key = %d\n",key);

-----

xc@xc-lenovo-g480:~/io/3-sharememery$ gcc testmsq.c -o testmsq

xc@xc-lenovo-g480:~/io/3-sharememery$ ./testmsq

key = 2064284135

#include

#include

#include

int msgget(key_t key, int msg***);

引數1:建立得到的金鑰

引數2:許可權–ipc_creat(建立) ipc_excl(是否存在)

返回值:成功–建立的ipc通訊物件

失敗-- -1

int ipc_fd =  msgget(key, ipc_creat);

if(ipc_fd == -1)

printf("ipc_fd = %d\n",ipc_fd);

3.msgrcv()訊息的接受,msgsnd()訊息的傳送

#include

#include

#include

int msgsnd(int msqid, const void msgp, size_t msgsz, int msg***);

引數1:操作的訊息佇列物件的id

引數2:訊息佇列的訊息緩衝區

struct msgbuf ;

引數3:訊息的長度

引數4:常用的- ipc_nowait–非阻塞;0–阻塞

返回值: 0 成功;-1 失敗

struct msgbuf mymsg;

mymsg.mtype = 100;

strcpy(mymsg.mtext,「hello msgq!」);

int send_ret = msgsnd(ipc_fd, &mymsg, strlen(mymsg.mtext), 0);

printf(「send_ret = %d\n」,send_ret);

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

引數1:操作的訊息佇列物件的id

引數2:訊息佇列的訊息緩衝區

struct msgbuf ;

引數3:訊息的型別–與傳送的對應!

引數4:常用的- ipc_nowait–非阻塞;0–阻塞

返回值: 接受的資料大小–成功;-1 – 接收失敗

struct msgbuf myrecv = ;

int recv_ret = msgrcv(ipc_fd, &myrecv, 1024, 100,0);

printf(「recv_ret = %d\n」,recv_ret);//出現亂碼,myrecv = ;清空快取

4.銷毀訊息佇列

msgctl

訊息佇列的設定:檢視,修改,刪除

#include

#include

#include

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

引數1:需要操作的ipc物件

引數2:常用的操作命令-- ipc_set–設定;ipc_rmid–刪除

引數3:如果是設定或者獲取資料則需要使用引數–man msgctl檢視結構體;若為刪除則填寫null

返回值: 0 成功; -1 失敗

例子:刪除:msgctl(msqid,ipc_rmid,null)

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

struct msgbuf

;int main()

printf

("key = %d\n"

,key)

;//2.建立管道

int ipc_fd =

msgget

(key,

ipc_creat

|0777);

if(ipc_fd ==-1

)printf

("ipc_fd = %d\n"

,ipc_fd)

;struct msgbuf mymsg;

mymsg.mtype =

100;

strcpy

(mymsg.mtext,

"hello msgq!");

int send_ret =

msgsnd

(ipc_fd,

&mymsg,

strlen

(mymsg.mtext),0

);printf

("send_ret = %d\n"

,send_ret)

;struct msgbuf myrecv =

; int recv_ret =

msgrcv

(ipc_fd,

&myrecv,

1024

,100,0

);printf

("recv_ret = %d\n"

,recv_ret)

;return0;

}

Swoole高階 04 程序(訊息佇列通訊)

普通形式 process new swoole process callback function false false oop形式 swoole process construct callable function redirect stdin stdout false create pipe...

程序通訊(訊息佇列)

訊息佇列與管道不同的是,訊息佇列是基於訊息的,而管道是基於位元組流的,且訊息佇列的讀取不一定是先入先出。訊息佇列與命名管道有一 樣的不足,就是每個訊息的最大長度是有上限的 msgmax 每個訊息佇列的總的位元組 數是有上限的 msgmnb 系統上訊息佇列的總數也有乙個上限 msgmni ipc物件資...

程序通訊 訊息佇列

訊息佇列的使用 建立開啟訊息佇列msgget 讀資料從佇列msgrcv 寫資料到佇列msgsnd 控制訊息佇列msgctl 目前主要有兩種型別的訊息佇列 posix訊息佇列以及系統v訊息佇列,系統v訊息佇列目前被大量使用 訊息佇列的核心持續性要求每個訊息佇列都在系統範圍內對應唯一的鍵值,所以,要獲得...