linux-文件描述符

簡介

內核(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

普通打開文件線程

clipboard.png

文件共享指針

clipboard.png

父進程與子進程普通打開文件code

clipboard.png

子進程會fork父進程,因此會和父進程的文件描述符表相同,所以共享父進程已經打開的文件對象

核心思想:
由於每一個進程都有本身HANDLE的存儲空間;若是是同一個進程的線程,由於同基於I/O多路複用的流同樣,多個線程運行在單一進程的上下文中,共享這個進程虛擬地址空間的整個內容,包括它的代碼、數據、堆、共享庫和打開的文件(句柄)

關於2>&1的含義

0是標準輸入 1是標準輸出 2是標準錯誤輸出

含義:將標準錯誤輸出重定向到標準輸出
符號>&是一個總體,不可分開,分開後就不是上述含義了。
好比有些人可能會這麼想:2是標準錯誤輸入,1是標準輸出,>是重定向符號,那麼"將標準錯誤輸出重定向到標準輸出"是否是就應該寫成"2>1"就好了?是這樣嗎?
若是是嘗試過,你就知道2>1的寫法實際上是將標準錯誤輸出重定向到名爲"1"的文件裏去了
寫成2&>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...

相關文章
相關標籤/搜索