UNIX管道應用及Shell實現(三) 多管道實現

2021-08-17 02:32:07 字數 2393 閱讀 1294

本篇主要介紹多管道實現,自己也寫得不好,希望大家多多指點。

我在這篇文章中較詳細的講解了管道的實現,但當時只涉及到乙個管道,因此只需要關心對管道的read和write,並不需要關心read到什麼地方去。

首先,我們在使用pipe建立管道後,需要fork乙個程序,子程序用於向管道寫,父程序用於向管道讀(注意,順序不能顛倒)。很有趣的乙個問題是,當我們使用fork命令時,子父程序的執行順序是不能確定的,那麼是讓父程序向管道讀還是子程序向管道讀呢?

我的理解是,由於父程序不能先於子程序結束,而如果管道中沒有東西,從管道讀的操作會被堵塞,可以利用這個性質讓子程序先於父程序結束。具體做法就是:讓父程序向管道讀,子程序向管道寫。由於「向管道寫」操作總是先於「向管道讀」操作,因此可以做到父程序結束前**子程序的工作。

那麼,我們怎麼做到多管道進行操作呢?其實也不難,我們可以先把所需要的所有管道建立好,然後當子程序要進行execv操作之前,把它的輸出fd指向下乙個管道的輸入,這樣重複進行就能實現多個管道進行通訊了。

要注意的是,當進行到最後乙個命令,這時候我們需要判斷:若最後乙個命令就是「|」,則我們需要將管道中的資料輸出到螢幕即可;若最後乙個命令時」>」,則需要將管道中的命令寫入對應的檔案中。

總體來說對於管道的操作有三種情況:

1. 最開始有「

2. 一開始就是多個管道進行傳輸,最後輸出到螢幕。

3. 通過多個管道傳輸後,最後重定向到指定檔案。

其實這三種情況都可以寫成乙個函式,因為只需要對第乙個命令和最後乙個命令進行特殊處理即可。由於筆者很蠢,最開始沒想到第一種情況,因此後面只能用修改字串的方法曲線救國了,**很醜,將就看吧。

pipe_command:

void pipe_command()

j++;

}/*if

thelast command is > or >>*/

for (i = 0; i <= commandinfo.index; i++)

/*init the pipe*/

for (i = 0; i < 20; i++)

pipe(pipefd[i]);

i = 1;

if (fork() != 0) else

} else }

對於多管道進行迴圈操作:

for mult-pipes*/

void next_pipe(int pipefd[20][2], int pipenumber, int pointerindex)

/*loop to connect the pipe*/

while (pipenumber--) else

}/*if

thelast command is > or >>*/

if (flag) else

read(pipefd[i][0], buffer, maxline); /*read

from pipe*/

write(fd, buffer, strlen(buffer)); /*write

into

file*/

} else

return;}

對第一種情況進行曲線救國:

至此,終於完成了乙個簡單shell的實現。雖然實現中碰到了不少的問題,最後的**也不夠優美,但這次實驗讓自己認識到了不少的問題。

1. c語言使用還不夠熟練,特別是對於unix的各種系統呼叫。

2. 沒有想清楚了再動筆,**組織結構有問題,模組化不夠。

3. 多檔案的協調和編譯還不夠熟練,編譯順序?makefile檔案?還不太會用。

4. 很多小bug沒有意識到,比如說直接輸入回車,子父程序的管理和**等等。

5. 單元測試還不太會。

雖然把project要求完成了,但前前後後改得面目全非,導致自己都不願意再看**了。先挖個坑,等有時間了再重新理理思路,定個小目標,用兩百行左右**寫好。

linux shell的實現

operating system:design and implementation,third edition

computer systems: a programmer』s perspective, 3/e

Linux下Shell的管道及命令

1 管道命令 管道命令只能執行前乙個命令的standard output 而不能接收 standard error output 2 cut 選取命令,切出資訊中的一段。d 後面接分割字元,根據分割字元,分成數段,與 f一起使用,f指明取出第幾段。c 以字元的單位取出固定的字元區間。3 cut使用範...

shell程式設計之十一 for迴圈語句應用實踐

1 普通語法 for 變數名 in 變數取值列表 do 指令。done 2 c語言型for迴圈語法 for exp1 exp2 exp3 do 指令。done用for迴圈豎向列印1 2 3 4 5共5個數字。root centos6 kvm3 scripts cat 11 01.sh bin bas...

27 miscdevice裝置驅動應用及實現原理

miscdevice是字元裝置驅動的簡化版本,方便實現乙個簡單的字元裝置驅動.只適用於沒有同型別的裝置驅動.也就是乙個驅動只對應乙個硬體.include struct miscdevice extern int misc register struct miscdevice misc 註冊miscd...