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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux進程間的五種通信方式介紹 3

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

3、For Example

下面寫了一個簡單的使用消息隊列進行IPC的例子,服務端程序一直在等待特定類型的消息,當收到該類型的消息以后,發送另一種特定類型的消息作為反饋,客戶端讀取該反饋并打印出來。

msg_server.c

#include#include#include#include
// 用于創建一個唯一的key#define MSG_FILE "/etc/passwd"
// 消息結構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);
// 創建消息隊列 if ((msqid = msgget(key, IPC_CREAT|0777)) == -1) { perror("msgget error"); exit(1); } // 打印消息隊列ID及進程ID printf("My msqid is: %d.\\n", msqid); printf("My pid is: %d.\\n", getpid());
// 循環讀取消息 for(;;) { msgrcv(msqid, &msg, 256, 888, 0);// 返回類型為888的第一個消息 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// 用于創建一個唯一的key#define MSG_FILE "/etc/passwd"
// 消息結構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);
// 打開消息隊列 if ((msqid = msgget(key, IPC_CREAT|0777)) == -1) { perror("msgget error"); exit(1); }
// 打印消息隊列ID及進程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;}

四、信號

信號量(semaphore)與已經介紹過的 IPC 結構不同,它是一個計數器。信號量用于實現進程間的互斥與同步,而不是用于存儲進程間通信數據。

1、特點

  1. 信號量用于進程間同步,若要在進程間傳遞數據需要結合共享內存。
  2. 信號量基于操作系統的 PV 操作,程序對信號量的操作都是原子操作。
  3. 每次對信號量的 PV 操作不僅限于對信號量值加 1 或減 1,而且可以加減任意正整數。
  4. 支持信號量組。

2、原型

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

Linux 下的信號量函數都是在通用的信號量數組上進行操作,而不是在一個單一的二值信號量上進行操作。

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

當semget創建新的信號量集合時,必須指定集合中信號量的個數(即num_sems),通常為1;如果是引用一個現有的集合,則將num_sems指定為 0 。

在semop函數中,sembuf結構的定義如下:

struct sembuf {    short sem_num; // 信號量組中對應的序號,0~sem_nums-1    short sem_op;  // 信號量值在一次操作中的改變量    short sem_flg; // IPC_NOWAIT, SEM_UNDO}

其中 sem_op 是一次操作中的信號量的改變量:

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

在semctl函數中的命令有多種,這里就說兩個常用的:

  • SETVAL:用于初始化信號量為一個已知的值。所需要的值作為聯合semun的val成員來傳遞。在信號量第一次使用之前需要設置信號量。
  • IPC_RMID:刪除一個信號量集合。如果不刪除信號量,它將繼續在系統中存在,即使程序已經退出,它可能在你下次運行此程序時引發問題,而且信號量是一種有限的資源。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11446

    瀏覽量

    212675
  • IPC
    IPC
    +關注

    關注

    3

    文章

    360

    瀏覽量

    52827
  • 進程間通信
    +關注

    關注

    0

    文章

    16

    瀏覽量

    2501
收藏 0人收藏

    評論

    相關推薦
    熱點推薦

    Linux進程如何實現共享內存通信

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

    Linux進程通信方式-管道

    Linux進程通信方式-管道分享到: 本文關鍵字: linux 管道
    發表于 08-29 15:29

    Linux進程通信

    華清遠見嵌入式linux學習資料《Linux進程通信》,通過前面的學習,讀者已經知道了進程
    發表于 09-04 10:07

    Linux現有的所有進程IPC方式

    在開始回答前,先簡單概括性地說說Linux現有的所有進程IPC方式:1. **管道:**在創建時分配一個page大小的內存,緩存區大小比較有限;2. 消息隊列:信息復制兩次,額外的C
    發表于 08-20 06:17

    哪些方式可以實現Linux系統下的進程通信

    哪些方式可以實現Linux系統下的進程通信進程與線程有哪些不同之處呢?
    發表于 12-24 06:38

    Linux進程通信方式——管道

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

    Linux進程通信方法之管道

    上文中我們介紹進程通信的方法之一:信號,本文將繼續介紹另一
    的頭像 發表于 05-14 15:47 ?2145次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進程</b><b class='flag-5'>間</b><b class='flag-5'>通信</b>方法之管道

    Linux進程通信方式介紹 1

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

    Linux進程通信方式介紹 2

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

    Linux進程通信方式介紹 4

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

    Linux進程通信方式介紹 6

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

    Linux進程通信方式介紹 5

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

    常見的進程通信方式

    進程通信 如果兩個進程,想要知道對方在干嘛,或者進行協調運行,就需要進程
    的頭像 發表于 10-08 15:48 ?1588次閱讀
    常見的<b class='flag-5'>進程</b><b class='flag-5'>間</b><b class='flag-5'>通信</b><b class='flag-5'>方式</b>

    進程通信方式總結

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

    進程通信的消息隊列介紹

    消息隊列是一非常常見的進程通信方式
    的頭像 發表于 04-08 17:27 ?475次閱讀
    主站蜘蛛池模板: 免费果冻传媒2021视频 | 美女漏bb| 午夜免费无码福利视频麻豆 | 在线 国产 欧美 专区 | 曰本xxⅹ孕妇性xxx | 深夜释放自己在线观看 | 久久久国产精品免费A片蜜芽广 | 国产 高清 无码 中文 | 欧美乱妇狂野欧美在线视频 | 99视频精品全部免费免费观 | 校花在公车上被内射好舒服 | 精品无码人妻一区二区免费AV | 男人到天堂a线牛叉在线 | 日韩午夜欧美精品一二三四区 | 黑人娇小BBW | 欧美日韩国产高清综合二区 | 欧洲亚洲精品A片久久99果冻 | 国产精品久久久亚洲偷窥女厕 | 手机看片国产免费 | 青青久久网 | 亚洲无码小格式 | 亚欧成人毛片一区二区三区四区 | 国产成人精品三级在线 | 日本高清免费一本视频在线观看 | 91精品乱码一区二区三区 | 国产精品亚洲精品日韩电影 | 欧美 另类 美腿 亚洲 无码 | 超碰最新地址 | 乌克兰粉嫩摘花第一次 | 又黄又肉到湿的爽文 | 国产h视频在线观看网站免费 | 伊人影院综合网 | 浓毛BWBWBWBWBW日本 | 国产亚洲美女精品久久久2020 | 国产精品色欲AV亚洲三区软件 | 一二三四在线视频社区8 | 国产精品久久毛片A片软件爽爽 | 日产精品久久久久久久蜜殿 | 被滋润的艳妇疯狂呻吟白洁老七 | 亚洲色大成网站www久久九九 | 内射气质御姐视频在线播放 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品