2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab6
目錄 Contents pipe 介紹 Beaglebone pipe 範例 Beaglebone 實作 Beaglebone
1-1 pipe 介紹 管線命令 (pipe) 功能: 在執行命令列時,有時候會下達多個指令,會取得想要的資料及格式,所以我們會需要將這些指令結合成管線命令,把前一項的輸出結果直接再代入第二個命令。通常用「|」這個符號的表示連結一個命令的輸出與輸入。 舉例: 「 ls | more 」 shell會先執行ls指令,再將ls的輸出結果(standard output,簡稱STDOUT)當作more的輸入(standard input,簡稱STDIN),執行過程如以下的圖:
1-2 pipe 介紹 管線命令 (pipe) 注意: 接在「|」後面的指令必須是要可以接收 STDIN 才行 (ex. more) 管線命令僅處理standard output,會忽略standard error output的訊息,意即僅能接收前一個命令傳送的正確訊息。 standard output 指令大致分為六大類: 擷取命令:cut、grep 排序命令:sort、wc、uniq 雙向重導向:tee 字元轉換命令:tr、col、join、paste、expand 分割命令:split 參數代換:xargs 補充資料:http://linux.vbird.org/linux_basic/0320bash.php#pipe
pipe 介紹 1-3 管線命令 (pipe) 檔案描述符 (file descriptor)、標準輸入輸出 (Standard Input Output) 0:Standard Input (STDIN),預設為鍵盤輸入值 1:Standard Output (STDOUT),預設為終端機螢幕顯示輸出 2:Standard Error (STDERR),預設為終端機螢幕顯示輸出 補充資料:http://inspire-future.blogspot.tw/2016/12/file-descriptor.html https://dotblogs.com.tw/ghoseliang/2013/05/29/105049
2-1 pipe 範例 pipe 範例 1 標頭檔: #include <unistd.h> 參數: int pipe(int fd[2]); 說明: fd[0] 為管道裡的讀取端 fd[1] 為管道裡的寫入端
2-2 pipe 範例 pipe 範例 2 dup & dup2: 功能:複製file descriptor。 dup:返回新的file descriptor (沒有用的file descriptor最小的編號)。 dup2:可以讓用戶指定返回的file descriptor的值,如果需要,則首先接近newfd的值,通常用來重新打開或者重定向一個file descriptor 。 在此程式是讓pipe去取代外部程式的標準輸出(standard output),然後讓主程式用pipe接收。 標頭檔: #include <unistd.h> 函數: int dup(int oldfd); int dup2(int oldfd, int newfd);
實作 參考第一個範例,在parent和child的process各自產生一個1~10的亂數,透過pipe的方式將child裡面的亂數值輸出給parent裡面,並在parent process裡面將兩個亂數值相加在printf出來。 亂數: 標頭檔: #include <time.h> #include <sys/wait.h> 函數: int rand1; srand(seed); //seed->time(0) //seed->time(0)+getpid() rand1 = rand() % RANGE ; Ex. 取 1-10 的亂數 a=(rand() % 10) +1 取 1-100 的亂數 a=(rand() % 100) +1 取 101-1000 的亂數 a=(rand() % 901) +100
Thanks 作業系統實習 Operating Systems