管道及其簡單實現

2021-10-23 14:08:31 字數 2479 閱讀 2785

管道也叫管道檔案,是檔案的一種。其中分為有名管道和無名管道,有名管道:可以在任意兩個程序間通訊;無名管道:只能在父子程序間通訊。管道的通訊方式是半雙工的,那麼什麼是半雙工呢?就像收音機、印表機一樣。那既然有半雙工,當然也會有全雙工,全雙工就向**一樣雙方都可以進行通話。

管道分為讀端和寫端,顧名思義,寫端就是向管道中寫入資料,讀端就是向管道中讀取資料。

有名管道

首先我們通過mkfifo fifo來建立乙個管道,接著我們分別建立出讀端和寫端。

對檔案進行進行操作的方法有三種,它們分別是:o_edonly唯讀 o_wronly只寫 o_edwr讀寫(注意,在管道中是沒有讀寫操作的,因為它是乙個半雙工的模式)

我們用open函式來開啟管道,它的標頭檔案是#include ,函式原型如下:

int open(const char pathname, int flags);//已經建立好了管道

int open(const char pathname, int flags, mode_t mode);//全新建立管道

流程大概如下:

1.我們定義乙個整形變數來接受它的返回值,我們知道0(標準輸入),1(標準輸出),2(標準錯誤輸出)已經被占用,所以理論上它的返回值為3

2.當返回值為-1時,出錯

3.我們定義乙個訊號sigpipe**,當觸發這個訊號時,我們呼叫fun函式來列印錯誤

當給乙個已經關閉的檔案中寫入資料時,會產生乙個sigpipe訊號,預設終止程式

4.定義乙個足夠大的陣列並初始化為0,從鍵盤上獲取到的字元都寫入到buff中

5.將buff中的字元寫入到檔案中,並做判斷當輸入的字元是"end"時,跳出

6.關閉檔案描述符並退出程式

**如下:

void

fun(

int sig)

intmain()

signal

(sigpipe,fun)

;//當給乙個已經關閉的socket中寫入資料時,會產生乙個sigpipe訊號,預設終止程式

while(1

);fgets

(buff,

128,

stdin);

write

(fd,buff,

strlen

(buff));

if(strncmp

(buff,

"end",3

)==0)

//如果輸入的字元時end,則退出

}close

(fd)

;exit(0

);}

讀端**如下,只是將寫入資料變為讀取資料

int

main()

while(1

);read

(fd,buff,

127);if

(strncmp

(buff,

"end",3

)==0)

printf

("read:%s\n"

,buff);}

close

(fd)

;exit(0

);}

無名管道

無名管道主要由pipe()來建立,主要用在父子程序中。我們定義的fd[2]主要是用來進行讀寫操作的,在下面的**中,子程序用來讀操作,父程序用來寫操作。

int

main()

;int n =

read

(fd[0]

, buff,

127);if

(n <=0)

printf

("child read(%d)==%s\n"

, n, buff);}

close

(fd[0]

);}else

;fgets

(buff,

128,

stdin);

if(strncmo

(buff,

"end",3

)==0)

write

(fd[1]

, buff,

strlen

(buff));

}close

(fd[1]

);}}

管道的實現:我們在建立的管道中,會將其分為若干的乙個位元組大小的字元,相當於乙個鍊錶。

裡面有兩個指標來對這個鍊錶進行操作。剛開始時,頭指標和尾指標會指向第乙個空節點,當有資料寫入時,頭指標就會往後走(注意,頭指標始終指向空),當有檔案對管道進行讀取時,尾指標就會往後跑。那麼相應的,當管道為空時,讀操作會阻塞,當管道寫滿後,寫操作就會阻塞住。

最後對管道進行一下總結:

1.有名管道是在兩個程序中使用

2.無名程序只能在父子程序中使用

3.管道的通訊方式是半雙工

4.寫入管道的資料是寫在記憶體中的

linux實現簡單的shell以及管道

include include include include include include include include includeusing namespace std const int shellnum 32 const char file all const char file h...

匿名管道實現基於Socket的簡單cmd後門

back.h ifndef backdoor h define backdoor h extern handle hreadone pipe one read extern handle hwriteone pipe one write extern handle hwritetwo pipe tw...

python實現管道

首先,感謝abersheeran 他也是index.py的作者。看了這段 不禁感嘆 天才就是99 的汗水 1 的靈感,但沒有這1 的靈感那99 的汗水也是徒勞 大佬的思路我們還是看看就好,能理解就行了,創造出來還是很有難度的 from functools import partial class f...