每次學習都沒有記錄,這裡我就記錄一下。
Linux中標準輸入為0,標準輸出為1,標準錯誤輸出為2
那麼./a.out 0 就是測試標準輸入是否具可讀。因為預設標準輸入是終端,終端是可讀可寫的。故輸出為read write
但是$ ./a.out 0 < /dev/tty 實際是$ ./a.out 0 0< /dev/tty是把/dev/tty重新導向為標準輸入,那麼fcntl(0,F_GETFL,0)就是判斷/dev/tty的讀寫屬性,而/dev/tty是唯讀,故輸出為read ony
若是$ ./a.out 1 < /dev/tty 實際是$ ./a.out 1 0< /dev/tty是把/dev/tty重新導向為標準輸入,但此時的標準輸出未變,仍為終端。但因為argv[1]的值為1,測試的仍然是終端的屬性,故輸出為read write。
// 暫時先寫到這,可能理解不太對,還要再改改。
$ ./a.out 1 > temp.foo 就是輸出重新導向,temp.foo是個建立的檔案,那麼fcntl(1, F_GETFL, 0);就是判斷temp.foo的讀寫屬性,建立的temp.foo預設是read write的
$ ./a.out 0 > temp.foo同理,輸出被重新導向到temp.foo,但是判斷的仍然是標準輸入,也就是終端,故還是read write
//下面討論./a.out 2 2>>temp.foo
先來補點理論知識
2代表stderr
2>>filename # 重新導向並追加stderr到檔案"filename".
那麼./a.out 2 2>>temp.foo 就是檢查被重新導向後的檔案temp.foo的在檔案描述符2上的屬性
對於
$ ./a.out 5 5<>temp.foo同樣需要補理論知識
[j]<>filename # 為了讀寫"filename", 把檔案"filename"開啟, 並且將檔案描述符"j"分配給它. # 如果檔案"filename"不存在, 那麼就建立它. # 如果檔案描述符"j"沒指定, 那預設是fd 0, stdin.
5<>temp.foo表示在檔案描述符5上開啟檔案temp.foo以供讀和寫,程式就是檢查temp.foo的讀寫屬性,很明顯我是"<>"的,也就是讀寫開啟這個檔案的
那麼結果也就是read write