Diğer cevaplar harika şeyler ekledi. Sadece 2 sent ekleyeceğim.
Wikipedia'ya göre kesin olarak biliyoruz: bir dosya tanımlayıcı negatif olmayan bir tamsayıdır. Eksik olduğunu düşündüğüm en önemli şey şunu söylemek olurdu:
Dosya tanımlayıcıları bir işlem kimliğine bağlıdır.
Biz en ünlü dosya tanımlayıcıları 0, 1 ve 2. 0 karşılık gelir biliyorum STDIN
, 1 STDOUT
ve 2 STDERR
.
Örneğin, kabuk süreçlerini örnek olarak alın ve bunun için nasıl uygulanır?
Bu kodu inceleyin
#>sleep 1000 &
[12] 14726
14726 (PID) kimliğine sahip bir işlem oluşturduk. Kullanarak lsof -p 14726
biz böyle şeyler alabilirsiniz:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sleep 14726 root cwd DIR 8,1 4096 1201140 /home/x
sleep 14726 root rtd DIR 8,1 4096 2 /
sleep 14726 root txt REG 8,1 35000 786587 /bin/sleep
sleep 14726 root mem REG 8,1 11864720 1186503 /usr/lib/locale/locale-archive
sleep 14726 root mem REG 8,1 2030544 137184 /lib/x86_64-linux-gnu/libc-2.27.so
sleep 14726 root mem REG 8,1 170960 137156 /lib/x86_64-linux-gnu/ld-2.27.so
sleep 14726 root 0u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 1u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 2u CHR 136,6 0t0 9 /dev/pts/6
4. sütun FD ve bir sonraki sütun TYPE, Dosya Tanımlayıcı ve Dosya Tanımlayıcı türüne karşılık gelir.
FD için bazı değerler şunlar olabilir:
cwd – Current Working Directory
txt – Text file
mem – Memory mapped file
mmap – Memory mapped device
Ancak gerçek dosya tanımlayıcı altında:
NUMBER – Represent the actual file descriptor.
Sayıdan sonraki karakter, yani "1u", dosyanın açıldığı modu gösterir. okumak için r, yazmak için w, okumak ve yazmak için u.
TYPE dosyanın türünü belirtir. TYPE değerlerinden bazıları:
REG – Regular File
DIR – Directory
FIFO – First In First Out
Ancak tüm dosya tanımlayıcıları CHR - Karakter özel dosyası (veya karakter aygıtı dosyası)
Şimdi, biz Dosya Tanıtıcılar belirleyebilir STDIN
, STDOUT
ve STDERR
kolay lsof -p PID
, yoksa biz eğer aynı görebilirsiniz ls /proc/PID/fd
.
Ayrıca, çekirdeğin izlediği dosya tanımlayıcı tablosunun, dosyalar tablosu veya inodes tablosu ile aynı olmadığını unutmayın. Diğer cevapların açıkladığı gibi bunlar ayrıdır.
Kendinize bu dosya tanımlayıcılarının fiziksel olarak nerede olduğunu ve /dev/pts/6
örneğin nelerin depolandığını sorabilirsiniz
sleep 14726 root 0u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 1u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 2u CHR 136,6 0t0 9 /dev/pts/6
Eh, /dev/pts/6
bellekte tamamen yaşıyor. Bunlar normal dosyalar değil, karakter aygıtı dosyalarıdır . Bunu şununla kontrol edebilirsiniz: ls -l /dev/pts/6
ve c
benim durumumda başlayacaklar crw--w----
.
OS gibi Linux'un çoğunu hatırlamak için yedi dosya türü tanımlar:
- Düzenli dosyalar
- Dizinler
- Karakter cihazı dosyaları
- Cihaz dosyalarını engelle
- Yerel alan adı soketleri
- Adlandırılmış borular (FIFO'lar) ve
- Sembolik bağlantılar