一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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)程間的五種通信方式介紹 1

jf_78858299 ? 來(lái)源:阿Q正磚 ? 作者:阿Q正磚 ? 2023-02-15 10:18 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

進(jìn)程間通信(IPC,InterProcess Communication)是指在不同進(jìn)程之間傳播或交換信息。IPC的方式通常有管道(包括無(wú)名管道和命名管道)、消息隊(duì)列、信號(hào)量、共享內(nèi)存、Socket(套接字)等。其中 Socket和支持不同主機(jī)上的兩個(gè)進(jìn)程IPC。

一、管道

管道,通常指無(wú)名管道,是 UNIX 系統(tǒng)IPC最古老的形式。

1、特點(diǎn):

  1. 它是半雙工的(即數(shù)據(jù)只能在一個(gè)方向上流動(dòng)),具有固定的讀端和寫端。
  2. 它只能用于具有親緣關(guān)系的進(jìn)程之間的通信(也是父子進(jìn)程或者兄弟進(jìn)程之間)。
  3. 它可以看成是一種特殊的文件,對(duì)于它的讀寫也可以使用普通的read、write 等函數(shù)。但是它不是普通的文件,并不屬于其他任何文件系統(tǒng),并且只存在于內(nèi)存中。

2、原型:

#includeintpipe(int fd[2]);  // 返回值:若成功返回0,失敗返回-1;

當(dāng)一個(gè)管道建立時(shí),它會(huì)創(chuàng)建兩個(gè)文件描述符:fd[0]為讀而打開(kāi),fd[1]為寫而打開(kāi)。如下圖:

圖片

要關(guān)閉管道只需將這兩個(gè)文件描述符關(guān)閉即可。

3、For Example

單個(gè)進(jìn)程中的管道幾乎沒(méi)有任何用處。所以,通常調(diào)用 pipe 的進(jìn)程接著調(diào)用 fork,這樣就創(chuàng)建了父進(jìn)程與子進(jìn)程之間的 IPC 通道。如下圖所示:

圖片

若要數(shù)據(jù)流從父進(jìn)程流向子進(jìn)程,則關(guān)閉父進(jìn)程的讀端(fd[0])與子進(jìn)程的寫端(fd[1]);反之,則可以使數(shù)據(jù)流從子進(jìn)程流向父進(jìn)程。

#include#includeint main(){    int fd[2]; // 兩個(gè)文件描述符    pid_t pid;    char buff[20];    if (pipe(fd) < 0)    {        printf("Create Pipe Error!\\n");    }    if ((pid = fork()) < 0) // 創(chuàng)建子進(jìn)程    {        printf("Fork Error!\\n");    }    else if (pid > 0) // 父進(jìn)程    {        close(fd[0]); // 關(guān)閉讀端        write(fd[1], "Hello World\\n", 12);    }    else    {        close(fd[1]); // 關(guān)閉寫端        read(fd[0], buff, 20);        printf ("%s", buff);    }    return 0;}

二、FIFO

FIFO,也稱為命名管道,是一種文件類型。

1、特點(diǎn)

  1. FIFO可以在無(wú)關(guān)的進(jìn)程之間交換數(shù)據(jù),與無(wú)名管道不同。
  2. FIFO有路徑名與之相關(guān)聯(lián),它以一種特殊設(shè)備文件形式存在于文件系統(tǒng)中。

2、原型

#include// 返回值:成功返回0, 出錯(cuò)返回-1intmkfifo(constchar* pathname, mode_t mode);

其中的 mode 參數(shù)與open函數(shù)中的 mode 相同。一旦創(chuàng)建了一個(gè) FIFO,就可以用一般的文件I/O函數(shù)操作它。

當(dāng) open 一個(gè)FIFO時(shí),是否設(shè)置非阻塞標(biāo)志(O_NONBLOCK)的區(qū)別:

  • 若沒(méi)有指定O_NONBLOCK(默認(rèn)),只讀 open 要阻塞到某個(gè)其他進(jìn)程為寫而打開(kāi)此 FIFO。類似的,只寫 open 要阻塞到某個(gè)其他進(jìn)程為讀而打開(kāi)它。
  • 若指定了O_NONBLOCK,則只讀 open 立即返回。而只寫 open 將出錯(cuò)返回 -1 如果沒(méi)有進(jìn)程已經(jīng)為讀而打開(kāi)該 FIFO,其errno置ENXIO。

3、For Example

FIFO的通信方式類似于在進(jìn)程中使用文件來(lái)傳輸數(shù)據(jù),只不過(guò)FIFO類型文件同時(shí)具有管道的特性。在數(shù)據(jù)讀出時(shí),F(xiàn)IFO管道中同時(shí)清除數(shù)據(jù),并且“先進(jìn)先出”。下面的例子演示了使用 FIFO 進(jìn)行 IPC 的過(guò)程:

write_fifo.c

#include#include // exit#include // O_WRONLY#include#include // time
int main(){ int fd; int n, i; char buf[1024]; time_t tp;
printf("I am %d process.\\n", getpid()); // 說(shuō)明進(jìn)程ID
if((fd = open("fifo1", O_WRONLY)) < 0) // 以寫打開(kāi)一個(gè)FIFO { perror("Open FIFO Failed"); exit(1); }
for(i=0; i<10; ++i) { time(&tp); // 取系統(tǒng)當(dāng)前時(shí)間 n=sprintf(buf,"Process %d's time is %s",getpid(),ctime(&tp)); printf("Send message: %s", buf); // 打印 if(write(fd, buf, n+1) < 0) // 寫入到FIFO中 { perror("Write FIFO Failed"); close(fd); exit(1); } sleep(1); // 休眠1秒 } close(fd); // 關(guān)閉FIFO文件 return 0;}

read_fifo.c

#include
int main(){ int fd; int len; char buf[1024]; if (mkfifo("fifo 1", 0666) < 0 && errno != EXIST) // 創(chuàng)建FIFO管道 { perror ("Create FIFO Failed\\n"); } if ((fd = open("fifo 1", R_ONLY)) < 0) // 以讀方式打開(kāi) { perror ("Open FIFO Failed\\n"); exit(1); } while ((len == read(buf, buf, 1024)) > 0) // 讀取FIFO管道 { printf ("Read Message: %s", buf); } close(fd); return 0;}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11497

    瀏覽量

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

    關(guān)注

    3

    文章

    365

    瀏覽量

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

    關(guān)注

    0

    文章

    16

    瀏覽量

    2521
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

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

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

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

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

    Linux進(jìn)程通信

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

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

    在開(kāi)始回答前,先簡(jiǎn)單概括性地說(shuō)說(shuō)Linux現(xiàn)有的所有進(jìn)程IPC方式1. **管道:**在創(chuàng)建時(shí)分配一個(gè)page大小的內(nèi)存,緩存區(qū)大小比較
    發(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 ?1614次閱讀
    <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 ?2215次閱讀
    <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)程通信方式介紹 2

    進(jìn)程通信(IPC,InterProcess Communication)是指在不同進(jìn)程之間傳播或交換信息。IPC的方式通常有管道(包括無(wú)名
    的頭像 發(fā)表于 02-15 10:19 ?746次閱讀
    <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)程通信方式介紹 3

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

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

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

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

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

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

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

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

    進(jìn)程通信 如果兩個(gè)進(jìn)程,想要知道對(duì)方在干嘛,或者進(jìn)行協(xié)調(diào)運(yùn)行,就需要進(jìn)程
    的頭像 發(fā)表于 10-08 15:48 ?1651次閱讀
    常見(jiàn)的<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 ?1062次閱讀
    <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ì)列是一非常常見(jiàn)的進(jìn)程通信方式。
    的頭像 發(fā)表于 04-08 17:27 ?519次閱讀