色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux進(jìn)程間的五種通信方式介紹 3

jf_78858299 ? 來源:阿Q正磚 ? 作者:阿Q正磚 ? 2023-02-15 10:19 ? 次閱讀

3、For Example

下面寫了一個(gè)簡(jiǎn)單的使用消息隊(duì)列進(jìn)行IPC的例子,服務(wù)端程序一直在等待特定類型的消息,當(dāng)收到該類型的消息以后,發(fā)送另一種特定類型的消息作為反饋,客戶端讀取該反饋并打印出來。

msg_server.c

#include#include#include#include
// 用于創(chuàng)建一個(gè)唯一的key#define MSG_FILE "/etc/passwd"
// 消息結(jié)構(gòu)struct msg_form { long mtype; char mtext[256];};
int main(){ int msqid; key_t key; struct msg_form msg; // 獲取key值 if((key = ftok(MSG_FILE,'z')) < 0) { perror("ftok error"); exit(1); }
// 打印key值 printf("Message Queue - Server key is: %d.\\n", key);
// 創(chuàng)建消息隊(duì)列 if ((msqid = msgget(key, IPC_CREAT|0777)) == -1) { perror("msgget error"); exit(1); } // 打印消息隊(duì)列ID及進(jìn)程ID printf("My msqid is: %d.\\n", msqid); printf("My pid is: %d.\\n", getpid());
// 循環(huán)讀取消息 for(;;) { msgrcv(msqid, &msg, 256, 888, 0);// 返回類型為888的第一個(gè)消息 printf("Server: receive msg.mtext is: %s.\\n", msg.mtext); printf("Server: receive msg.mtype is: %d.\\n", msg.mtype);
msg.mtype = 999; // 客戶端接收的消息類型 sprintf(msg.mtext, "hello, I'm server %d", getpid()); msgsnd(msqid, &msg, sizeof(msg.mtext), 0); } return 0; }

msg_client.c

#include#include#include#include// 用于創(chuàng)建一個(gè)唯一的key#define MSG_FILE "/etc/passwd"
// 消息結(jié)構(gòu)struct msg_form { long mtype; char mtext[256];};
int main(){ int msqid; key_t key; struct msg_form msg;
// 獲取key值 if ((key = ftok(MSG_FILE, 'z')) < 0) { perror("ftok error"); exit(1); }
// 打印key值 printf("Message Queue - Client key is: %d.\\n", key);
// 打開消息隊(duì)列 if ((msqid = msgget(key, IPC_CREAT|0777)) == -1) { perror("msgget error"); exit(1); }
// 打印消息隊(duì)列ID及進(jìn)程ID printf("My msqid is: %d.\\n", msqid); printf("My pid is: %d.\\n", getpid());
// 添加消息,類型為888 msg.mtype = 888; sprintf(msg.mtext, "hello, I'm client %d", getpid()); msgsnd(msqid, &msg, sizeof(msg.mtext), 0);
// 讀取類型為777的消息 msgrcv(msqid, &msg, 256, 999, 0); printf("Client: receive msg.mtext is: %s.\\n", msg.mtext); printf("Client: receive msg.mtype is: %d.\\n", msg.mtype); return 0;}

四、信號(hào)

信號(hào)量(semaphore)與已經(jīng)介紹過的 IPC 結(jié)構(gòu)不同,它是一個(gè)計(jì)數(shù)器。信號(hào)量用于實(shí)現(xiàn)進(jìn)程間的互斥與同步,而不是用于存儲(chǔ)進(jìn)程間通信數(shù)據(jù)。

1、特點(diǎn)

  1. 信號(hào)量用于進(jìn)程間同步,若要在進(jìn)程間傳遞數(shù)據(jù)需要結(jié)合共享內(nèi)存。
  2. 信號(hào)量基于操作系統(tǒng)的 PV 操作,程序?qū)π盘?hào)量的操作都是原子操作。
  3. 每次對(duì)信號(hào)量的 PV 操作不僅限于對(duì)信號(hào)量值加 1 或減 1,而且可以加減任意正整數(shù)。
  4. 支持信號(hào)量組。

2、原型

最簡(jiǎn)單的信號(hào)量是只能取 0 和 1 的變量,這也是信號(hào)量最常見的一種形式,叫做二值信號(hào)量(Binary Semaphore)。而可以取多個(gè)正整數(shù)的信號(hào)量被稱為通用信號(hào)量。

Linux 下的信號(hào)量函數(shù)都是在通用的信號(hào)量數(shù)組上進(jìn)行操作,而不是在一個(gè)單一的二值信號(hào)量上進(jìn)行操作。

#include// 創(chuàng)建或獲取一個(gè)信號(hào)量組:若成功返回信號(hào)量集ID,失敗返回-1intsemget(key_t key, int num_sems, int sem_flags);// 對(duì)信號(hào)量組進(jìn)行操作,改變信號(hào)量的值:成功返回0,失敗返回-1intsemop(int semid, struct sembuf semoparray[], size_t numops);  // 控制信號(hào)量的相關(guān)信息intsemctl(int semid, int sem_num, int cmd, ...);

當(dāng)semget創(chuàng)建新的信號(hào)量集合時(shí),必須指定集合中信號(hào)量的個(gè)數(shù)(即num_sems),通常為1;如果是引用一個(gè)現(xiàn)有的集合,則將num_sems指定為 0 。

在semop函數(shù)中,sembuf結(jié)構(gòu)的定義如下:

struct sembuf {    short sem_num; // 信號(hào)量組中對(duì)應(yīng)的序號(hào),0~sem_nums-1    short sem_op;  // 信號(hào)量值在一次操作中的改變量    short sem_flg; // IPC_NOWAIT, SEM_UNDO}

其中 sem_op 是一次操作中的信號(hào)量的改變量:

  • 若sem_op > 0,表示進(jìn)程釋放相應(yīng)的資源數(shù),將 sem_op 的值加到信號(hào)量的值上。如果有進(jìn)程正在休眠等待此信號(hào)量,則換行它們。
  • 若sem_op < 0,請(qǐng)求 sem_op 的絕對(duì)值的資源。
    • sem_flg 指定IPC_NOWAIT,則semop函數(shù)出錯(cuò)返回EAGAIN
    • sem_flg 沒有指定IPC_NOWAIT,則將該信號(hào)量的semncnt值加1,然后進(jìn)程掛起直到下述情況發(fā)生:
    • 當(dāng)相應(yīng)的資源數(shù)可以滿足請(qǐng)求,此信號(hào)量的semncnt值減1,該信號(hào)量的值減去sem_op的絕對(duì)值。成功返回;
    • 此信號(hào)量被刪除,函數(shù)smeop出錯(cuò)返回EIDRM;
    • 進(jìn)程捕捉到信號(hào),并從信號(hào)處理函數(shù)返回,此情況下將此信號(hào)量的semncnt值減1,函數(shù)semop出錯(cuò)返回EINTR
    • 如果相應(yīng)的資源數(shù)可以滿足請(qǐng)求,則將該信號(hào)量的值減去sem_op的絕對(duì)值,函數(shù)成功返回。
    • 當(dāng)相應(yīng)的資源數(shù)不能滿足請(qǐng)求時(shí),這個(gè)操作與sem_flg有關(guān)。
  • 若sem_op == 0,進(jìn)程阻塞直到信號(hào)量的相應(yīng)值為0:
    • sem_flg指定IPC_NOWAIT,則出錯(cuò)返回EAGAIN。
    • sem_flg沒有指定IPC_NOWAIT,則將該信號(hào)量的semncnt值加1,然后進(jìn)程掛起直到下述情況發(fā)生:
    • 信號(hào)量值為0,將信號(hào)量的semzcnt的值減1,函數(shù)semop成功返回;
    • 此信號(hào)量被刪除,函數(shù)smeop出錯(cuò)返回EIDRM;
    • 進(jìn)程捕捉到信號(hào),并從信號(hào)處理函數(shù)返回,在此情況將此信號(hào)量的semncnt值減1,函數(shù)semop出錯(cuò)返回EINTR
    • 當(dāng)信號(hào)量已經(jīng)為0,函數(shù)立即返回。
    • 如果信號(hào)量的值不為0,則依據(jù)sem_flg決定函數(shù)動(dòng)作:

在semctl函數(shù)中的命令有多種,這里就說兩個(gè)常用的:

  • SETVAL:用于初始化信號(hào)量為一個(gè)已知的值。所需要的值作為聯(lián)合semun的val成員來傳遞。在信號(hào)量第一次使用之前需要設(shè)置信號(hào)量。
  • IPC_RMID:刪除一個(gè)信號(hào)量集合。如果不刪除信號(hào)量,它將繼續(xù)在系統(tǒng)中存在,即使程序已經(jīng)退出,它可能在你下次運(yùn)行此程序時(shí)引發(fā)問題,而且信號(hào)量是一種有限的資源。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11373

    瀏覽量

    211298
  • IPC
    IPC
    +關(guān)注

    關(guān)注

    3

    文章

    353

    瀏覽量

    52268
  • 進(jìn)程間通信
    +關(guān)注

    關(guān)注

    0

    文章

    16

    瀏覽量

    2467
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux進(jìn)程如何實(shí)現(xiàn)共享內(nèi)存通信

    這次我們來講一下Linux進(jìn)程通信中重要的通信方式:共享內(nèi)存作為Linux軟件開發(fā)攻城獅,
    發(fā)表于 04-26 17:14 ?732次閱讀

    Linux進(jìn)程通信方式-管道

    Linux進(jìn)程通信方式-管道分享到: 本文關(guān)鍵字: linux 管道
    發(fā)表于 08-29 15:29

    Linux進(jìn)程通信

    華清遠(yuǎn)見嵌入式linux學(xué)習(xí)資料《Linux進(jìn)程通信》,通過前面的學(xué)習(xí),讀者已經(jīng)知道了進(jìn)程
    發(fā)表于 09-04 10:07

    Linux現(xiàn)有的所有進(jìn)程IPC方式

    在開始回答前,先簡(jiǎn)單概括性地說說Linux現(xiàn)有的所有進(jìn)程IPC方式:1. **管道:**在創(chuàng)建時(shí)分配一個(gè)page大小的內(nèi)存,緩存區(qū)大小比較有限;2. 消息隊(duì)列:信息復(fù)制兩次,額外的C
    發(fā)表于 08-20 06:17

    哪些方式可以實(shí)現(xiàn)Linux系統(tǒng)下的進(jìn)程通信

    哪些方式可以實(shí)現(xiàn)Linux系統(tǒng)下的進(jìn)程通信?進(jìn)程與線程有哪些不同之處呢?
    發(fā)表于 12-24 06:38

    Linux進(jìn)程通信方式——管道

    管道是Linux進(jìn)程通信的一方式,它把一個(gè)程序的輸出直接連接到另一個(gè)程序的輸入。
    發(fā)表于 06-01 09:13 ?1522次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進(jìn)程</b><b class='flag-5'>間</b><b class='flag-5'>通信</b><b class='flag-5'>方式</b>——管道

    Linux進(jìn)程通信方法之管道

    上文中我們介紹進(jìn)程通信的方法之一:信號(hào),本文將繼續(xù)介紹另一
    的頭像 發(fā)表于 05-14 15:47 ?2067次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進(jìn)程</b><b class='flag-5'>間</b><b class='flag-5'>通信</b>方法之管道

    Linux進(jìn)程通信方式介紹 1

    進(jìn)程通信(IPC,InterProcess Communication)是指在不同進(jìn)程之間傳播或交換信息。IPC的方式通常有管道(包括無名
    的頭像 發(fā)表于 02-15 10:18 ?1522次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進(jìn)程</b><b class='flag-5'>間</b>的<b class='flag-5'>五</b><b class='flag-5'>種</b><b class='flag-5'>通信</b><b class='flag-5'>方式</b><b class='flag-5'>介紹</b> 1

    Linux進(jìn)程通信方式介紹 2

    進(jìn)程通信(IPC,InterProcess Communication)是指在不同進(jìn)程之間傳播或交換信息。IPC的方式通常有管道(包括無名
    的頭像 發(fā)表于 02-15 10:19 ?639次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進(jìn)程</b><b class='flag-5'>間</b>的<b class='flag-5'>五</b><b class='flag-5'>種</b><b class='flag-5'>通信</b><b class='flag-5'>方式</b><b class='flag-5'>介紹</b> 2

    Linux進(jìn)程通信方式介紹 4

    進(jìn)程通信(IPC,InterProcess Communication)是指在不同進(jìn)程之間傳播或交換信息。IPC的方式通常有管道(包括無名
    的頭像 發(fā)表于 02-15 10:19 ?673次閱讀

    Linux進(jìn)程通信方式介紹 6

    進(jìn)程通信(IPC,InterProcess Communication)是指在不同進(jìn)程之間傳播或交換信息。IPC的方式通常有管道(包括無名
    的頭像 發(fā)表于 02-15 10:19 ?566次閱讀

    Linux進(jìn)程通信方式介紹 5

    進(jìn)程通信(IPC,InterProcess Communication)是指在不同進(jìn)程之間傳播或交換信息。IPC的方式通常有管道(包括無名
    的頭像 發(fā)表于 02-15 10:20 ?666次閱讀

    常見的進(jìn)程通信方式

    進(jìn)程通信 如果兩個(gè)進(jìn)程,想要知道對(duì)方在干嘛,或者進(jìn)行協(xié)調(diào)運(yùn)行,就需要進(jìn)程
    的頭像 發(fā)表于 10-08 15:48 ?1457次閱讀
    常見的<b class='flag-5'>進(jìn)程</b><b class='flag-5'>間</b><b class='flag-5'>通信</b><b class='flag-5'>方式</b>

    進(jìn)程通信方式總結(jié)

    進(jìn)程通信(IPC): 進(jìn)程通信方式有很多,這里
    的頭像 發(fā)表于 11-09 09:25 ?864次閱讀
    <b class='flag-5'>進(jìn)程</b><b class='flag-5'>間</b><b class='flag-5'>通信</b><b class='flag-5'>方式</b>總結(jié)

    進(jìn)程通信的消息隊(duì)列介紹

    消息隊(duì)列是一非常常見的進(jìn)程通信方式。
    的頭像 發(fā)表于 04-08 17:27 ?379次閱讀
    主站蜘蛛池模板: 毛片免费观看的视频在线 | 久久精品免费看网站 | 寻找最美乡村教师颁奖晚会 | 成人免费观看在线视频 | 999国产高清在线精品 | 日日久久狠狠8888偷偷色 | 亚洲人女同志video | 99久久精品国产交换 | 国产偷抇久久精品A片蜜臀AV | WWW国产亚洲精品久久久日本 | 美女网站免费久久久久久久 | metart中国撒尿人体欣赏 | 亚洲精品蜜桃AV久久久 | 国产成人a一在线观看 | 99精品热视频30在线热视频 | 国产成人无码一区AV在线观看 | 视频一区国产精戏刘婷30 | 色欲天天婬色婬香影院 | 99国产视频 | 色拍拍噜噜噜久久蜜桃 | 亚洲高清视频免费 | 久久国产精品免费A片蜜芽 久久国产精品萌白酱免费 久久国产精品麻豆AV影视 | 99久酒店在线精品2019 | 国产伦精品一区二区三区 | 91avcom| 精品AV亚洲乱码一区二区 | 稚嫩挤奶h调教h | 国产毛片女人18水多 | 年轻的女职工在线观看 | 国产人成精品综合欧美成人 | 国产精品久久久久婷婷五月色 | 久久精品国产在热亚洲完整版 | 嫩草影院在线观看精品 | 国产精品国产三级国AV在线观看 | 色综合久久88一加勒比 | 国外经典三级 | 人妻天天爽夜夜爽三区麻豆A片 | 无码天堂亚洲国产AV久久 | 国产一区精选播放022 | 麻豆高清免费国产一区 | 在线观看国产人视频免费中国 |