$ ls -l /dev/stdin /dev/fd/0
lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2
lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0
$ ls -l /dev/pts/2 /proc/self/fd/0
crw--w---- 1 tim tty 136, 2 2011-08-07 09:54 /dev/pts/2
lrwx------ 1 tim tim 64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
- Saya bertanya-tanya apakah semua file di bawah
/dev
dan subdirektori adalah semua deskriptor file perangkat?
- Mengapa ada begitu banyak tautan dari satu sama lain? Sebagai contoh,
/dev/fd/0
,
/dev/stdin
, /proc/self/fd/0
semua link ke /dev/pts/2
.
- Jika
l
di lrwx------
link yang berarti, apa c
di crw--w----
berarti?
Jawaban:
Hampir semua file di bawah
/dev
adalah file perangkat . Sedangkan membaca dan menulis ke file biasa menyimpan data pada disk atau sistem file lain, mengakses file perangkat berkomunikasi dengan driver di kernel, yang umumnya pada gilirannya berkomunikasi dengan perangkat keras (perangkat perangkat keras, maka namanya).Ada dua jenis file perangkat: perangkat blok (ditunjukkan oleh
b
sebagai karakter pertama dalam outputls -l
), dan perangkat karakter (ditunjukkan olehc
). Perbedaan antara perangkat blok dan karakter tidak sepenuhnya universal. Block device adalah hal-hal seperti disk, yang berperilaku seperti file besar berukuran tetap: jika Anda menulis byte pada offset tertentu, dan kemudian membaca dari perangkat pada offset itu, Anda mendapatkan byte itu kembali. Perangkat karakter hanya tentang hal lain, di mana menulis byte memiliki efek langsung (misalnya dipancarkan pada baris serial) dan membaca byte juga memiliki efek langsung (misalnya dibaca dari port serial).Arti file perangkat ditentukan oleh nomornya, bukan oleh namanya (nama itu penting untuk aplikasi, tetapi tidak untuk kernel). Jumlahnya sebenarnya adalah dua angka: angka utama menunjukkan driver mana yang bertanggung jawab untuk perangkat ini, dan nomor minor memungkinkan pengemudi untuk mendorong beberapa perangkat several. Angka-angka ini muncul dalam
ls -l
daftar, di mana Anda biasanya akan menemukan ukuran file. Misalnyabrw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda
→ perangkat ini adalah 8 utama, minor 0.Beberapa file perangkat di bawah
/dev
tidak sesuai dengan perangkat perangkat keras. Salah satu yang ada pada setiap sistem unix adalah/dev/null
; menulis ke sana tidak berpengaruh, dan membaca darinya tidak pernah mengembalikan data apa pun. Seringkali nyaman dalam skrip shell, ketika Anda ingin mengabaikan output dari perintah (>/dev/null
) atau menjalankan perintah tanpa input (</dev/null
). Contoh umum lainnya adalah/dev/zero
(yang mengembalikan null byte ad infinitum )/dev/urandom
(yang mengembalikan byte acak ad infinitum ).Beberapa file perangkat memiliki arti yang tergantung pada proses yang mengaksesnya. Misalnya,
/dev/stdin
menunjuk input standar dari proses saat ini; membuka dari memiliki efek yang kira-kira sama dengan membuka file asli yang dibuka sebagai input standar proses. Agak serupa,/dev/tty
menunjuk terminal tempat proses terhubung. Di Linux, saat ini,/dev/stdin
dan teman tidak diimplementasikan sebagai perangkat karakter, melainkan sebagai tautan simbolis ke mekanisme yang lebih umum yang memungkinkan setiap deskriptor file untuk direferensikan (bukan hanya 0, 1 dan 2 di bawah metode tradisional); misalnya/dev/stdin
adalah tautan simbolis ke/proc/self/fd/0
. Lihat Bagaimana / dev / fd berhubungan dengan / proc / self / fd /? .Anda akan menemukan sejumlah tautan simbolis di bawah
/dev
. Ini dapat terjadi karena alasan historis: file perangkat dipindahkan dari satu nama ke nama lain, tetapi beberapa aplikasi masih menggunakan nama lama. Sebagai contoh,/dev/scd0
adalah tautan simbolis ke/dev/sr0
Linux; keduanya menunjuk perangkat CD pertama. Alasan lain untuk link simbolik adalah organisasi: di Linux, Anda akan menemukan hard disk dan partisi di beberapa tempat:/dev/sda
dan/dev/sda1
dan teman-teman (setiap disk yang ditunjuk oleh surat sewenang-wenang, dan partisi sesuai dengan tata letak partisi),/dev/disk/by-id/*
(disk yang ditunjuk oleh nomor seri unik),/dev/disk/by-label/*
(partisi dengan sistem file, ditunjuk oleh label pilihan manusia); dan lainnya. Tautan simbolik juga digunakan ketika nama perangkat generik dapat menjadi salah satu dari beberapa; sebagai contoh/dev/dvd
mungkin tautan simbolis ke/dev/sr0
, atau mungkin tautan/dev/sr1
jika Anda memiliki dua pembaca CD dan yang kedua adalah menjadi pembaca DVD default.Akhirnya, ada beberapa file lain yang mungkin Anda temukan di bawah
/dev
, karena alasan tradisional. Anda tidak akan menemukan hal yang sama di setiap sistem. Pada sebagian besar unices,/dev/log
adalah soket yang digunakan program untuk memancarkan pesan log./dev/MAKEDEV
adalah skrip yang membuat entri dalam/dev
. Pada sistem Linux modern, entri dalam/dev/
dibuat secara otomatis oleh udev , usangMAKEDEV
.¹ Ini sebenarnya tidak lagi berlaku di Linux, tetapi detail ini hanya penting bagi penulis driver perangkat.
sumber
ls -l
daftar di mana Anda biasanya menemukan ukuran file, sebelum tanggal, misalnyabrw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda
→ perangkat ini adalah 8 utama, minor 0. Nomor perangkat tidak sering muncul dalam praktik, saya hanya menyebut mereka untuk mengatakan apa yang membuat perangkat menjadi perangkat (yang paling penting, itu bukan nama file). Nomor deskriptor file hanya memiliki arti dalam proses tertentu./dev/stdin
(=>/proc/self/fd/0
) di Linux tidak memiliki efek yang sama dengan menduplikasi input standar. Untuk melihat perbedaannya,,su - non_root_user
makaexec 5</dev/stdin
akan gagal dengan "Izin Ditolak", tetapiexec 5<&0
akan berhasil. Dan bukan hanya itu fd baru akan dibuka dengan bendera yang berbeda, segala sesuatu tentang file objek ( "open file descrip tion " di POSIX lingo) akan berbeda (file pointer offset, non / modus blocking, dll)./dev/
./dev/stdin
. Ini tidak menunjuk secara statis ke/dev/pts/2
atau yang lain - hanya beralih ke terminal lain dan Anda akan melihat./dev/stdin
adalah input standar dari sesi terminal Anda saat ini . Itu juga contoh mengapa perlu symlink.man mknod
daninfo coreutils 'mknod invocation'
. Secara umum,c
singkatan dari tipe perangkat karakter.sumber
/dev/stdin
mengacu pada input standar dari proses yang akan membukanya. Semua yang ada di dalamnya/proc/$pid
adalah data yang bergantung pada proses, dan/proc/self
merupakan semacam symlink ajaib yang menunjuk ke data proses itu sendiri.Untuk pertanyaan pertama Anda, mereka bukan deskriptor file, mereka adalah file perangkat. (alias "dev node")
File-file itu terikat dengan driver yang menangani perangkat menggunakan nomor utama dan kecil. (Misalnya, "136, 2" dalam
ls
output Anda merujuk ke driver perangkat terikat ke nomor utama 136, dan menentukan perangkat # 2 yang ditangani oleh driver itu.)Huruf keluaran pertama
ls -l
adalah jenis perangkat jika ada file perangkat. Jika itu 'c' itu adalah perangkat karakter, atau jika itu adalah 'b', itu adalah perangkat blok.Untuk pertanyaan kedua Anda, lihat jawaban di atas oleh rozcietrzewiacz.
sumber