精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

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

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

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

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

一、管道

管道,通常指無名管道,是 UNIX 系統IPC最古老的形式。

1、特點:

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

2、原型:

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

當一個管道建立時,它會創建兩個文件描述符:fd[0]為讀而打開,fd[1]為寫而打開。如下圖:

圖片

要關閉管道只需將這兩個文件描述符關閉即可。

3、For Example

單個進程中的管道幾乎沒有任何用處。所以,通常調用 pipe 的進程接著調用 fork,這樣就創建了父進程與子進程之間的 IPC 通道。如下圖所示:

圖片

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

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

二、FIFO

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

1、特點

  1. FIFO可以在無關的進程之間交換數據,與無名管道不同。
  2. FIFO有路徑名與之相關聯,它以一種特殊設備文件形式存在于文件系統中。

2、原型

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

其中的 mode 參數與open函數中的 mode 相同。一旦創建了一個 FIFO,就可以用一般的文件I/O函數操作它。

當 open 一個FIFO時,是否設置非阻塞標志(O_NONBLOCK)的區別:

  • 若沒有指定O_NONBLOCK(默認),只讀 open 要阻塞到某個其他進程為寫而打開此 FIFO。類似的,只寫 open 要阻塞到某個其他進程為讀而打開它。
  • 若指定了O_NONBLOCK,則只讀 open 立即返回。而只寫 open 將出錯返回 -1 如果沒有進程已經為讀而打開該 FIFO,其errno置ENXIO。

3、For Example

FIFO的通信方式類似于在進程中使用文件來傳輸數據,只不過FIFO類型文件同時具有管道的特性。在數據讀出時,FIFO管道中同時清除數據,并且“先進先出”。下面的例子演示了使用 FIFO 進行 IPC 的過程:

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()); // 說明進程ID
if((fd = open("fifo1", O_WRONLY)) < 0) // 以寫打開一個FIFO { perror("Open FIFO Failed"); exit(1); }
for(i=0; i<10; ++i) { time(&tp); // 取系統當前時間 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); // 關閉FIFO文件 return 0;}

read_fifo.c

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

    關注

    87

    文章

    11225

    瀏覽量

    208920
  • IPC
    IPC
    +關注

    關注

    3

    文章

    345

    瀏覽量

    51822
  • 進程間通信
    +關注

    關注

    0

    文章

    16

    瀏覽量

    2431
收藏 人收藏

    評論

    相關推薦

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

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

    Linux進程通信方式-管道

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

    Linux進程通信

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

    Linux現有的所有進程IPC方式

    在開始回答前,先簡單概括性地說說Linux現有的所有進程IPC方式1. **管道:**在創建時分配一個page大小的內存,緩存區大小比較
    發表于 08-20 06:17

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

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

    Linux進程通信方式——管道

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

    Linux進程通信方式介紹 2

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

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

    Linux進程通信方式介紹 4

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

    Linux進程通信方式介紹 6

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

    Linux進程通信方式介紹 5

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

    常見的進程通信方式

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

    進程通信的消息隊列介紹

    消息隊列是一非常常見的進程通信方式
    的頭像 發表于 04-08 17:27 ?284次閱讀