重定向和管道的實現
重定向標準輸入的實現:
1)close-then-open: close(0) ; fd=open("test",O_RDONLY); fd將是stdin。
2)open-close-dup-close:
fd=open(file),打開stdin將要重定向的文件;close(0);new_fd=dup(file);close(fd);new_fd就是被重定向的stdin
3)open-dup2-close:
fd=open(file);new_fd=dup2(fd,0);close(fd);
重定向標準輸出的實現:
父進程fork();子進程close(1);create("g",0644),此時子進程的stdout被重定向到g;接下來子進程exec某個程序,文件描述符屬於進程屬性,exec調用不會改變他們,那麼運行的程序的標準輸出將被送到g,由此實現了標準輸出重定向。
本質上重定向的實現是依賴兩個原則:
1、標準輸入、標準輸出和標準錯誤分別是0、1和2
2、最低可用描述符:打開文件時,為此文件安排的描述符總是進程內打開文件數組的最低可用位置的索引。
管道:
匿名管道:適合於有親緣關係的進程,通過pipe函數實現。
有名管道:通過mkfifo函數實現,實現進程間的雙向通訊可以采用兩個有名管道實現,也可以采用socketpair調用。
文章轉自莊周夢蝶 ,原文發布時間2008-02-29
最後更新:2017-05-17 17:32:03