協同程序 管道實現

2021-10-08 16:45:52 字數 1324 閱讀 2082

15.4 協同程序

(1)概念

過濾程式:指從標準輸入中讀取資料,向標準輸出寫資料的程式(比如管道產生兩個程式)。

協同程序:某個過濾程式1既能產生過濾程式2的輸入,又能讀取讀取過濾程式2的輸出時,過濾程式1就為協同程序(coprocess)

注:1.管道就是協同程序的例子。

2.當子程序為過濾程式時,父程序產生子程序的輸入,同時父程序又讀取子程序的輸入,這時子程序程式為協同程序。

3.popen只提供連線到另乙個程序的標準輸入或標準輸出的乙個單向管道,而協同程序則有連線到另乙個程序的兩個單向通道。

(2)協同程序的示例

1.程序建立兩個管道:乙個是協同程序的標準輸入,另乙個是協同程序的標準輸出

2.fork乙個子程序

3.父程序從子程序那兒讀取資料,父程序對資料處理後將資料輸出到標準輸出。

#include #include #include #include #include #include #include #include #include #include #include #include #include #define string_maxlen 50

/* 測試目的:

(2)協同程序的示例

1.程序建立兩個管道:乙個是協同程序的標準輸入,另乙個是協同程序的標準輸出

2.fork乙個子程序

3.父程序從子程序的標準輸入中讀取資料,父程序對資料處理後將輸出到子程序的標準輸出。

測試結果:

123456 // 子程序從終端輸入的

cw: 123456 // 子程序向管道1寫入的

pr: 123456 // 父程序從管道1中讀出的

pw: 3456 // 父程序向管道2寫入的

cr: 3456 // 子程序從管道2讀出的

*/int main()

; // 子程序寫,父程序讀

int fds2[2]=; // 子程序讀,父程序寫

pid_t pid;

char wbuf[string_maxlen+1]=;

char rbuf[string_maxlen+1]=;

// creat pipes

assert(0 == pipe(fds1));

assert(0 == pipe(fds2));

// 建立子程序

if (0 > (pid = fork()))

else if(0 == (pid = fork()))

else

pause();

return 0;

}

管道之 協同程序

協同程序 參考 在shell 管道中,當乙個程式產生乙個過濾器的輸入,又讀取這個過濾器的輸出,則此種過濾程式叫做協同程序.協同程序通常在shell的後台執行,其標準輸入和標準輸出通過管道連線到另乙個程式。popen 與協同程序的區別 popen只提供連線到另乙個程序的標準輸入或標準輸出的乙個單向管道...

程序間通訊之協同程序

unix系統過濾程式從標準輸入讀取資料,對其進行適當處理後寫到標準輸出。幾個過濾程式通常在shell管道命令列中線性地連線。當乙個程式產生某個過濾程式的輸入,同時又讀取該過濾程式的輸出時,則該過濾程式就成為協同程序 coprocess korn shell提供了協同程序。bourne shell b...

協同程序實現生產者消費者

及注釋如下,使用print函式列印值和行號,可以看到 的執行路徑 resume協程,如果協程執行的過程中呼叫yield函式,則resume函式返回yield的引數 function receive prod local status,value coroutine.resume prod print...