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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 消息对lie_Linux进程间通信之消息队列总结

發布時間:2024/10/5 linux 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 消息对lie_Linux进程间通信之消息队列总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、系統V IPC

三種系統V IPC:消息隊列、信號量以及共享內存(共享存儲器)之間有很多相似之處。

每個內核中的 I P C結構(消息隊列、信號量或共享存儲段)都用一個非負整數的標識符( i d e n t i f i e r )加以引用。

無論何時創建I P C結構(調用m s g g e t、 s e m g e t或s h m g e t) ,都應指定一個關鍵字(k e y),關鍵字的數據類型由系統規定為 k e y _ t,通常在頭文件< s y s / t y p e s . h >中被規定為長整型。關鍵字由內核變換成標識符。

以上簡單介紹了IPC,對接下來介紹的消息隊列、信號量和共享內存有助于理解。

二、消息隊列

1、簡介

消息隊列是消息的鏈接表 ,存放在內核中并由消息隊列標識符標識。我們將稱消息隊列為 “隊列”,其標識符為“隊列 I D”。 m s g g e t用于創建一個新隊列或打開一個現存的隊列。 m s g s n d用于將新消息添加到隊列尾端。每個消息包含一個正長整型類型字段,一個非負長度以及實際數據字節(對應于長度),所有這些都在將消息添加到隊列時,傳送給 m s g s n d。 m s g r c v用于從隊列中取消息。我們并不一定要以先進先出次序取消息,也可以按消息的類型字段取消息。

2、函數介紹

ftok函數

#include

#include

key_t ftok(const char *pathname, int proj_id);//“/home/linux” , 'a'

功能:生成一個key(鍵值)

msgget函數

#include

#include

#include

int msgget(key_t key, int msgflg);

功能:創建或取得一個消息隊列對象

返回:消息隊列對象的id 同一個key得到同一個對象

格式:msgget(key,flag|mode);

flag:可以是0或者IPC_CREAT(不存在就創建)

mode:同文件權限一樣

msgsnd函數

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

功能:將msgp消息寫入標識為msgid的消息隊列

msgp:

struct msgbuf {

long mtype; /* message type, must be > 0 */消息的類型必須>0

char mtext[1]; /* message data */長度隨意

};

msgsz:要發送的消息的大小 不包括消息的類型占用的4個字節

msgflg: 如果是0 當消息隊列為滿 msgsnd會阻塞

如果是IPC_NOWAIT 當消息隊列為滿時 不阻塞 立即返回

返回值:成功返回id 失敗返回-1

msgrcv函數

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

int msgflg);

功能:從標識符為msgid的消息隊列里接收一個指定類型的消息 并 存儲于msgp中 讀取后 把消息從消息隊列中刪除

msgtyp:為 0 表示無論什么類型 都可以接收

msgp:存放消息的結構體

msgsz:要接收的消息的大小 不包含消息類型占用的4字節

msgflg:如果是0 標識如果沒有指定類型的消息 就一直等待

如果是IPC_NOWAIT 則表示不等待

msgctl函數

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

msgctl(msgid,IPC_RMID,NULL);//刪除消息隊列對象

程序2-2將簡單演示消息隊列:

---? snd.c? ---

#include "my.h"

typedef struct{

long type;

char name[20];

int age;

}Msg;

int main()

{

key_t key = ftok("/home/liudw",'6');

printf("key:%x\n",key);

int msgid = msgget(key,IPC_CREAT|O_WRONLY|0777);

if(msgid<0)

{

perror("msgget error!");

exit(-1);

}

Msg m;

puts("please input your type name age:");

scanf("%ld%s%d",&m.type,m.name,&m.age);

msgsnd(msgid,&m,sizeof(m)-sizeof(m.type),0);

return 0;

}

---? rcv.c? ---

#include "my.h"

typedef struct{

long type;

char name[20];

int age;

}Msg;

int main()

{

key_t key = ftok("/home/liudw",'6');

printf("key:%x\n",key);

int msgid = msgget(key,O_RDONLY);

if(msgid<0)

{

perror("msgget error!");

exit(-1);

}

Msg rcv;

long type;

puts("please input type you want!");

scanf("%ld",&type);

msgrcv(msgid,&rcv,sizeof(rcv)-sizeof(type),type,0);

printf("rcv--name:%s age:%d\n",rcv.name,rcv.age);

msgctl(msgid,IPC_RMID,NULL);

return 0;

}

運行演示:

三、詳解ftok函數

ftok根據路徑名,提取文件信息,再根據這些文件信息及project ID合成key,該路徑可以隨便設置。

該路徑是必須存在的,ftok只是根據文件inode在系統內的唯一性來取一個數值,和文件的權限無關。

proj_id是可以根據自己的約定,隨意設置。這個數字,有的稱之為project ID; 在UNIX系統上,它的取值是1到255;

為了驗證以上觀點,對程序2-2稍作修改,將路徑和proj_id修改:

程序3-1如下:

---? snd.c? ---

#include "my.h"

typedef struct{

long type;

char name[20];

int age;

}Msg;

int main()

{

key_t key = ftok("/home",'a');

printf("key:%x\n",key);

int msgid = msgget(key,IPC_CREAT|O_WRONLY|0777);

if(msgid<0)

{

perror("msgget error!");

exit(-1);

}

Msg m;

puts("please input your type name age:");

scanf("%ld%s%d",&m.type,m.name,&m.age);

msgsnd(msgid,&m,sizeof(m)-sizeof(m.type),0);

return 0;

}

--- ?rcv.c ?---

#include "my.h"

typedef struct{

long type;

char name[20];

int age;

}Msg;

int main()

{

key_t key = ftok("/home",'a');

printf("key:%x\n",key);

int msgid = msgget(key,O_RDONLY);

if(msgid<0)

{

perror("msgget error!");

exit(-1);

}

Msg rcv;

long type;

puts("please input type you want!");

scanf("%ld",&type);

msgrcv(msgid,&rcv,sizeof(rcv)-sizeof(type),type,0);

printf("rcv--name:%s age:%d\n",rcv.name,rcv.age);

msgctl(msgid,IPC_RMID,NULL);

return 0;

}

運行演示如下圖:

 

總結:主要介紹了進程間通信的消息隊列。

總結

以上是生活随笔為你收集整理的linux 消息对lie_Linux进程间通信之消息队列总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。