無名管道

無名管道

無名管道是Linux系統核心的特殊檔案,用於父子進程之間的通信。

基本介紹

  • 中文名:無名管道
  • 所屬類型:Linux系統核心
  • 注意事項:不能在與windows共享的資料夾中創建
無名管道和有名管道是Linux系統核心的特殊檔案,用於進程之間的通信。
無名管道相當於一個佇列結構,fd[1]為寫入端(入隊),fd[0]為讀出端(出隊)。其中信息讀出後即刪除,再次讀取時即為下一個信息。
相關函式:
函式形式:int pipe(int fd[2])
功能:創建無名管道檔案。無名管道是一個特殊檔案,不可由open函式創建。
參數:fd[2]有兩個成員 fd[0]和 fd[1],他們都是檔案描述符。 管道有固定的讀端 fd[0]和固定的寫端 fd[1]。
返回值:成功返回 0,出錯返回-1。
說明:
1.管道是創建在記憶體中,進程結束空間釋放,管道不復存在。
2.無名管道和有名管道都是半雙工通信,實現雙向通信需要建立兩個管道。
3.無名管道是linux特殊檔案,。
4.無名管道只用於父子進程之間,有名管道可用於無親緣關係的進程之間。
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "unistd.h"     //包含 pipe() 和 fork() 函式
#include "sys/types.h"  //提供pid_t的定義
int main()
{
    int ret;
    int fd[2] = {0};
    char read_buf[32] = {0},write_buf[32] = {0};
    pid_t pid;
    ret = pipe(fd);
    if(ret == -1)
    {
        printf("create unnamed pipe error\n");
        return -1;
    }
    pid = fork();
    if(pid == 0)  //子進程
    {
        while(1)
        {
            printf("please input a word.\n");
            scanf("%s",write_buf);
            write(fd[1],write_buf);
            if(strcmp(write_buf,"qiut") == 0)
            {
                break;
            }
            memset(write_buf,0,32);
        }
    }
    if(pid > 0)  //父進程
    {
        while(1)
        {
            read(fd[0],read_buf);
            if(strcmp(read_buf,"qiut") == 0)
            {
                break;
            }
            printf("recv: read_buf = %s\n",read_buf);
            memset(write_buf,0,32);
        }
    }
    return 0;
}

相關詞條

熱門詞條

聯絡我們