1. 程式人生 > >Linux 程序間通訊之管道

Linux 程序間通訊之管道

程序之間的通訊之管道

目錄

1 無名管道


   管道是一種最基本的IPC機制,作用於父子程序之間,完成資料傳遞。
管道有以下特性:
1.其本質是一個偽檔案(實為核心緩衝區)其本質是一個偽檔案(實為核心緩衝區)
2.由兩個檔案描述符引用,一個表示讀端,一個表示寫端。
3.規定資料從管道的寫端流入管道,從讀端流出。
3.規定資料從管道的寫端流入管道,從讀端流出。
管道的原理: 管道實為核心使用環形佇列機制,藉助核心緩衝區(4k)實現。
無名管道的簡單實現:


#include <unistd.h>
#include <sys/stat.h>
#include <sys/wait.h> #include <sys/types.h> #include <fcntl.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <signal.h> int main() { int pipefd[2]; pid_t pid; if (pipe(pipefd) == -1 ) { printf
("pipe() err..\n"); return -1; } pid = fork(); if (pid == -1) { printf("fork err..\n"); return -1; } if (pid == 0) { close(pipefd[0]); write(pipefd[1], "hello hello....", 6); close(pipefd[1]); printf("child .....quit\n"
); } else if (pid > 0 ) { int len = 0; char buf[100] = {0}; close(pipefd[1]); len = read(pipefd[0], buf, 100); printf("len:%d, buf:%s \n", len , buf); close(pipefd[0]); } wait(NULL); printf("parent ..quit\n"); return 0; }

2.有名管道

命名管道也被稱為FIFO檔案,是一種特殊的檔案。由於linux所有的事物都可以被視為檔案,所以對命名管道的使用也就變得與檔案操作非常統一。
有名管道例項
1.建立管道C語言實現 或者 shell指令 : mkfifo 檔名
C語言實現

#include <unistd.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <fcntl.h>

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <sys/time.h>

/*
利用管道,兩個程序間進行檔案複製。
fifow
讀檔案1.txt    
    寫入管道
fifor   
    讀管道
    寫入2.txt檔案
    */

int main(int argc, char *argv[])
{
    //建立管道檔案
    int outfd = 0;

    //開啟管道檔案,準備寫資料
    outfd = open("fifop", O_WRONLY | O_NONBLOCK);
    //outfd = open("pp", O_WRONLY ); //阻塞模式
    if (outfd == -1)
    {
        printf("infd open() err..\n");
        exit(0);
    }

    return 0;
}

寫端

#include <unistd.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <fcntl.h>

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <sys/time.h>

/*
利用管道,兩個程序間進行檔案複製。
fifow
讀檔案1.txt    
    寫入管道
fifor   
    讀管道
    寫入2.txt檔案
    */

int main(int argc, char *argv[])
{
    //建立管道檔案
    mkfifo("fifop", 0644);
    int infd;

    //按只讀方式 開啟現有檔案
    infd = open("./1.txt", O_RDONLY);
    if (infd == -1)
    {
        printf("infd open() err..\n");
        exit(0);
    }
    int outfd;

    //開啟管道檔案,準備寫資料
    //outfd = open("fifop", O_WRONLY | O_NONBLOCK);
    outfd = open("fifop", O_WRONLY ); //阻塞模式
    if (outfd == -1)
    {
        printf("infd open() err..\n");
        exit(0);
    }

    char buf[1024];
    int n = 0;
    //從檔案中讀資料寫入管道檔案
    while ( (n = read(infd, buf, 1024)) > 0)
    {
        write(outfd, buf, n);   
    }
    close (infd);
    close (outfd);


    printf("fifow 寫管道檔案 success\n");
    return 0;
}

讀端

#include <unistd.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <fcntl.h>

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <sys/time.h>



int main(int argc, char *argv[])
{   
    //開啟2.txt 準備寫資料
    int outfd;
    outfd = open("./2.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644); //O_TRUNC 開啟檔案清空
    if (outfd == -1)
    {
        printf("open()  2.txt err..\n");
        exit(0);
    }


    //開啟管道檔案,準讀資料
    int infd;
    infd = open("fifop", O_RDONLY);
    if (infd == -1)
    {
        printf("open err ... \n");
        exit(0);
    }

    char buf[1024];
    int n = 0;
    //從檔案中讀資料寫入管道檔案
    while ( (n = read(infd, buf, 1024)) > 0)
    {
        write(outfd, buf, n);   
    }
    printf("讀管道檔案是否失敗。。。。\n");
    close (infd);
    close (outfd);
    unlink("fifop");


    printf("fifor 讀管道檔案 success\n");
    return 0;
}

3.管道讀寫規則

當沒有資料可讀時
O_NONBLOCK disable:read呼叫阻塞,即程序暫停執行,一直等到有資料來到為止。
O_NONBLOCK enable:read呼叫返回-1,errno值為EAGAIN。
當管道滿的時候

O_NONBLOCK disable: write呼叫阻塞,直到有程序讀走資料
O_NONBLOCK enable:呼叫返回-1,errno值為EAGAIN
如果所有管道寫端對應的檔案描述符被關閉,則read返回0

如果所有管道讀端對應的檔案描述符被關閉,則write操作會產生訊號SIGPIPE

當要寫入的資料量不大於PIPE_BUF時,linux將保證寫入的原子性。

當要寫入的資料量大於PIPE_BUF時,linux將不再保證寫入的原子性。

相關推薦

Linux程序通訊——管道(整理)

 程序間通訊 fork pipe pie_t 等用法(管道機制 通訊) 每個程序各自有不同的使用者地址空間,任 何一個程序的全域性變數在另一個程序中都看不到,所以程序之間要交換資料必須通過核心,在核心中開闢一塊緩衝 區,程序1把資料從使用者空間拷到核心緩衝區,程序2再從

Linux -- 程序通訊管道

管道是Linux裡的一種檔案型別,同時也是Linux系統下程序間通訊的一種方式 建立一個管道檔案有兩種方式: 1.  Shell 下命令 mkfifo + filename,即建立一個有名管道 2.

Linux 程序通訊管道

程序之間的通訊之管道 目錄 1 無名管道    管道是一種最基本的IPC機制,作用於父子程序之間,完成資料傳遞。 管道有以下特性: 1.其本質是一個偽檔案(實為核心緩衝區)其本質是一個偽檔案(實為核心緩衝區) 2.由兩

Linux程序通訊管道通訊詳解

        在學習程序的時候,我們瞭解到了程序的獨立性:程序之間是相互獨立的,每個程序有自己的虛擬地址空間,並且虛擬地址空間通過頁表的對映,對映到屬於自己的實體記憶體上。並且各個程序之間互相不影響,執行自己的程式碼。    

Linux下的程序通訊管道

在Linux下,每個程序各自有不同的使用者地址空間,任何一個程序的全域性變數在另一個程序中都看不到所以進 程之間要交換資料必須通過核心,在核心中開闢一塊緩衝區,程序1把資料從使用者空間拷到核心緩衝區,程序2再從核心緩衝區把資料讀走,核心提供的這種機制稱為程序間通

linux 程序通訊FIFO

1.概述 FIFO與管道幾乎類似,所以FIFO也是一個位元組流,從FIFO讀取的順序也是與被寫入FIFO的順序一致,容量是也有限的,也是可以確保寫入不超過PIPE_BUF位元組的操作是原子的,FIFO的本質也是一個管道,但傳遞方向是可以雙向的,它們兩者之間的最大差別在於FIFO在檔案系統中擁有一個名稱,並且

程序通訊管道--pipe和fifo使用

匿名管道pipe 函式原型: #include <unistd.h> int pipe(int fildes[2]); 引數說明 fildes是我們傳入的陣列,也是一個傳出引數。fildes[0]是讀端,fildes[1]是寫端。 返回值 成功呼叫返回0。 失敗呼叫返回-1且

Linux程序通訊——01管道

程序間通訊: 對於每個程序來說,都有一份屬於它自己的記憶體資源,並且獨佔這份記憶體資源。而程序間通訊的目的就是讓不同的程序間能看到一份公共的資源。所有交換的資料必須通過核心來傳遞,在核心中開闢一塊緩衝區,通過這塊緩衝區來實現資料的傳遞,核心提供的這種機制稱為程序間通訊。

LinuxLinux程序通訊訊息佇列

1、訊息佇列概念引入    訊息佇列提供了一個從一個程序向另外一個程序傳送一塊資料的方法每個資料塊都被認為是有一個型別,接收者程序接收的資料塊可以有不同的型別值訊息佇列也有管道一樣的不足,就是每個訊息的最大長度是有上限的(MSG

Linux程序通訊訊號通訊

訊號通訊是Linux程序間通訊的一種方式。 1.什麼是訊號? 訊號是系統響應某些條件而產生的一個事件,接收到該訊號的程序會相應地採取一些措施。例如我們在windows系統中想強制結束一個程式我們需要用到的是工作管理員,而在Linux中,我們是通過訊號來實現的,執

程序通訊管道通訊(PIPE匿名管道)

#include<stdio.h> #include<errno.h> #include<fcntl.h> #include<unistd.h> #include<stdlib.h> #include<string.h> int

Linux程序通訊pipe

1、管道(PIPE)        從概念上說,管道是兩個程序之間的一個connection,因此一個程序的標準輸出就變成了另一個程序的標準輸入。在Unix作業系統中,管道用於程序間通訊(inter-process communication). (1

Linux程序通訊POSIX訊息佇列

訊息佇列可認為是一個訊息連結串列,它允許程序之間以訊息的形式交換資料。有足夠寫許可權的程序或執行緒可往佇列中放置訊息,有足夠讀許可權的程序或執行緒可從佇列中取走訊息。每個訊息都是一個記錄,它由傳送者賦予一個優先順序。與管道不同,管道是位元組流模型,沒有訊息邊界。

linux 程序通訊訊號

Linux訊號(signal) 機制分析 轉載至:https://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html 【摘要】本文分析了Linux核心對於訊號的實現機制和應

Linux程序通訊POSIX共享記憶體

共享記憶體是最高效的IPC機制,因為它不涉及程序之間的任何資料傳輸。這種高效率帶來的問題是,我們必須用其他輔助手段來同步程序對共享記憶體的訪問,否則會產生競態條件。因此,共享記憶體通常和其他程序間通訊方式一起使用。 Linux下有三種共享記憶體的IPC技術:S

Linux程序通訊訊號量(semaphore)、訊息佇列(Message Queue)和共享記憶體(Share Memory)

System V 程序通訊方式:訊號量(semaphore)、訊息佇列(Message Queue)和共享記憶體(Share Memory) 訊號量 訊號量(semaphore)實際是一個整數,它的值由多個程序進行測試(test)和設定(set)。就每個程序所關心的測試和

linux程序通訊訊號量(semaphore)

==================================================== 訊號量(semaphore)簡介 當我們在多使用者系統,多程序系統,或是兩者混合的系統中使用執行緒操作編寫程式時,我們經常會發現我們有段臨界程式碼,在此處我們需要

程序通訊管道

何為程序間通訊 每個程序各自有不同的使用者地址空間,任何一個程序的全域性變數在另一個程序中都是看不到的。所以程序之間如果要交換資料就必須通過核心。 在核心中開闢一塊緩衝區,程序1把資料從使用者空間拷到核心緩衝區,程序2再從核心緩衝區把資料讀走,核心提供的這種機制稱為程序間

程序通訊Linux C管道程式設計

管道簡述 管道(pipe)是Unix/Linux中最常見的程序間通訊方式之一,它在兩個程序之間實現一個數據流通的通道,資料以一種資料流的方式在程序間流動。在系統中,管道相當於檔案系統上的一個檔案,用於快取所要傳輸的資料。在某些特性上又不同於檔案,例如當資料讀出後,管道中就沒有資料了,但檔案沒

Linux高階程式設計基礎——程序通訊匿名管道

程序間通訊之匿名管道 利用匿名管道實現父子程序間通訊,要求 父程序傳送字串“hello child”給子程序; 子程序收到父程序傳送的資料後,給父程序回覆“hello farther”; 父子程序通訊完畢,父程序依次列印子程序的退出狀態以及子程序的pid。