前言

昨天在寫socket那篇時資料中有關於檔案描述符(file descriptor)的內容,一時竟然想不起來了,大二下在中大修的作業系統,看來是遺忘掉很多了作為交換生當時邊學習邊快活。決定再重新梳理下本概念。

FD的WIKI定義(https://en.wikipedia.org/wiki/File_descriptor)

In Unix and related computer operating systems, a file descriptor (FD, less frequently fildes) is an abstract indicator (handle) used to access a file or other input/output resource, such as a pipe or network socket.

在類Unix系統中,FD是訪問檔案或IO資源的指針.且FD為一個非負整數。

FD與File table與Inode table之間的參照關係: 1024px-File_table_and_inode_table.svg

再具體一些: KCjzm

注意:多個FD可以指向FT中同一項(如系統調用:dup),多個FT可以指向同一個inode(檔案被多次打開時)

可見從FD指向FT再指向IT,文件的狀態信息和存儲位置信息等都可以被獲取到,FD是進行這些信息查找的發起identifer。

簡單講

在進程中打開一個文件時,OS要為該文件維護信息,而FD即是代表該文件在某一進程下的打開文件編號。

文件描述符與輸出重定向

在類Unix系統中,進程都包含以下三種FD: 20210218181107

重定向符號有:

重定向符號 效果
> 重定向到一個文件或設備(覆寫)
>> 重定向到一個文件或設備(添加)
< 輸入重定向到程序

用到兩種stream要用&引用,如2>&1(將標準錯誤重定向到標準輸出)

將標準輸出重定向到文件中(覆寫)

1
2
3
root@YoungDebian:/home/aozy/Desktop# echo "Hello" 1> test.txt 
root@YoungDebian:/home/aozy/Desktop# cat test.txt
Hello

將標準輸出重定向到文件中(添加)

1
2
3
4
root@YoungDebian:/home/aozy/Desktop# echo "Hello" 1>> test.txt 
root@YoungDebian:/home/aozy/Desktop# cat test.txt
Hello
Hello

將標準錯誤重定向到文件中(覆寫)

1
2
3
4
root@YoungDebian:/home/aozy/Desktop# date -m 2>test.txt
root@YoungDebian:/home/aozy/Desktop# cat test.txt
date: invalid option -- 'm'
Try 'date --help' for more information.

將標準輸入重定向到程序:

1
2
3
root@YoungDebian:/home/aozy/Desktop# cat 0< test.txt 
date: invalid option -- 'm'
Try 'date --help' for more information.