本篇主要介紹多管道實現,自己也寫得不好,希望大家多多指點。
我在這篇文章中較詳細的講解了管道的實現,但當時只涉及到乙個管道,因此只需要關心對管道的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...