內核(kernel)利用文件描述符(file descriptor)來訪問文件。
1.系統爲每個進程維護了一個文件描述符表,該表的值都是從0開始的,因此在不一樣的進程中你會看到相同的文件描述符,這種狀況下相同文件描述符有可能指向同一個文件,也有可能指向不一樣的文件
2.每個文件描述符會與一個打開文件相對應,同時,不一樣的文件描述符也會指向同一個文件。相同的文件能夠被不一樣的進程打開也能夠在同一個進程中被屢次打開。
3.習慣上,標準輸入(standard input)的文件描述符是 0,標準輸出(standard output)是 1,標準錯誤(standard error)是 2java
0,1,2分別對應標準輸入,標準輸出,錯誤輸出
3以及之後分別對應打開的文件shell
查看一個進程最多能容納文件描述符的數量centos
[root@VM_158_86_centos ~]# ulimit -n 100001
臨時修改文件描述符數命令app
[root@VM_158_86_centos ~]# ulimit -HSn 65536 [root@VM_158_86_centos ~]# ulimit -n 165536
永久修改文件描述符數spa
[root@VM_158_86_centos ~]# cat /etc/security/limits.conf # /etc/security/limits.conf root soft nofile 100001 root hard nofile 100002
文件句柄與文件描述符的做用:幫助系統或進程找到文件對象在內存的位置.net
普通打開文件線程
文件共享指針
父進程與子進程普通打開文件code
子進程會fork父進程,因此會和父進程的文件描述符表相同,所以共享父進程已經打開的文件對象
核心思想:
由於每一個進程都有本身HANDLE的存儲空間;若是是同一個進程的線程,由於同基於I/O多路複用的流同樣,多個線程運行在單一進程的上下文中,共享這個進程虛擬地址空間的整個內容,包括它的代碼、數據、堆、共享庫和打開的文件(句柄)
0是標準輸入 1是標準輸出 2是標準錯誤輸出
含義:將標準錯誤輸出重定向到標準輸出
符號>&是一個總體,不可分開,分開後就不是上述含義了。
好比有些人可能會這麼想:2是標準錯誤輸入,1是標準輸出,>是重定向符號,那麼"將標準錯誤輸出重定向到標準輸出"是否是就應該寫成"2>1"就好了?是這樣嗎?
若是是嘗試過,你就知道2>1的寫法實際上是將標準錯誤輸出重定向到名爲"1"的文件裏去了
寫成2&>1也是不能夠的
考慮以下一條shell命令
nohup java -jar app.jar >log 2>&1 &
爲何2>&1必定要寫到>log後面,才表示標準錯誤輸出和標準輸出都定向到log中?
咱們不妨把1和2都理解是一個指針,而後來看上面的語句就是這樣的:
原本1----->屏幕 (1指向屏幕)
執行>log後, 1----->log (1指向log)
執行2>&1後, 2----->1 (2指向1,而1指向log,所以2也指向了log)
再來分析下
nohup java -jar app.jar 2>&1 >log &
原本1----->屏幕 (1指向屏幕)
執行2>&1後, 2----->1 (2指向1,而1指向屏幕,所以2也指向了屏幕)
執行>log後, 1----->log (1指向log,2仍是指向屏幕)
因此這就不是咱們想要的結果。
文件描述符與進程:https://my.oschina.net/iuranu...
文件描述符2>$https://blog.csdn.net/zhaomin...