匿名管道介紹

匿名管道是進程間通信(IPC)的一種方式。基本思想是利用內存中共享的一段緩衝區,以文件的方式對緩衝區實現,但因爲該文件只存在內存中,無唯一命名,所以稱爲匿名。

優點:可以進行IPC通信,且相對來說簡單;

缺點:半雙工方式,即只能單向通信;只能在親屬關係的進程間使用,例如父子進程、兄弟進程。

應用場景:在具備親屬關係的進程間單向通信。如果需要進行雙向通信,需要創建兩個管道。

原理:首先父進程創建管道fd,父進程採用fork的方式創建子進程,子進程是父進程的副本,所以文件描述符也是複製的,類似於對文件描述符執行dup函數,共享文件表項。因爲父子進程共享同一文件表項(緩衝區),所以父子進程可實現通信。

父進程pipe
父進程pipe
fork創建子進程後
關閉父進程讀端,關閉子進程寫端

以上圖例完成父進程向管道寫入,子進程讀取管道的單向通信的功能。

使用示例:

#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main(int argc,char *argv[])
{
    int fd[2];
    int iRet = pipe(fd);
    if(iRet == -1)
    {
        printf("pipe failed!\n");
        return -1;
    }

    pid_t pid = fork();
    if(pid < 0)
    {
        printf("fork failed!\n");
        return -1;
    }
    else if(pid == 0)
    {
        close(fd[1]);
        char data[1024];
        size_t readBytes = read(fd[0],data,sizeof(data));
        if(readBytes == 0)
        {
            printf("read failed!\n");
            return -1;
        }
        printf("child process receive data:%s\n",data);
    }
    else
    {
        close(fd[0]);
        const char *sendData = "parent process send data to child process";
        size_t writeBytes = write(fd[1],sendData,strlen(sendData)+1);
        if(writeBytes == 0)
        {
            printf("send failed!\n");
            return -1;
        }
        printf("send data to child process success.\n");
    }

    getchar();
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章