Pada tingkat deskriptor file, stdin didefinisikan sebagai deskriptor file 0 , stdout didefinisikan sebagai deskriptor file 1; dan stderr didefinisikan sebagai deskriptor file 2 . Lihat ini.
Bahkan jika program Anda -atau shell- berubah (mis. redirect dengan dup2(2)) apa itu deskriptor file 0, itu selalu tetap stdin (karena menurut definisi STDIN_FILENO
adalah 0).
Syscalls seperti open(2) atau pipe(2) atau socket(2) dapat memberikan mis. STDIN_FILENO
(mis. 0) jika deskriptor file itu gratis (mis. Karena sudah close(2)-d sebelumnya). Tapi ketika itu terjadi, itu masih stdin menurut definisi.
Tentu saja, di stdio(3), FILE
stream stdin sedikit lebih kompleks. Program Anda dapat fclose(3), freopen(3), fdopen(3) ...
Meskipun beberapa jawaban sudah ada tetapi saya tidak menganggapnya cukup informatif untuk menjelaskan cerita lengkapnya.
Karena saya melanjutkan dan meneliti lebih banyak, saya menambahkan temuan saya.
Setiap kali proses dimulai, entri dari proses yang sedang berjalan ditambahkan ke /proc/<pid>
direktori. Ini adalah tempat di mana semua data yang terkait dengan proses disimpan. Selain itu, saat proses dimulai, kernel mengalokasikan 3 deskriptor file ke proses untuk komunikasi dengan 3 aliran data yang disebut sebagai stdin
, stdout
dan stderr
.
kernel linux menggunakan algoritme untuk selalu membuat FD dengan nilai bilangan bulat serendah mungkin sehingga aliran data ini dipetakan ke angka 0
, 1
dan 2
.
Karena ini hanyalah referensi ke aliran dan kami dapat menutup aliran. Seseorang dapat dengan mudah memanggil close(<fd>)
, dalam kasus kita close(1)
, untuk menutup deskriptor file.
melakukan ls -l /proc/<pid>/fd/
, kami hanya melihat 2 FD yang terdaftar di sana 0
dan 2
.
Jika sekarang kita melakukan open()
memanggil kernel akan membuat FD baru untuk memetakan referensi file baru ini dan karena kernel menggunakan algoritme integer pertama terendah, ia akan mengambil nilai integer 1
.
Jadi sekarang, FD baru yang dibuat menunjuk ke file yang kita buka (menggunakan open()
syscall)
Transfer data apa pun yang terjadi sekarang bukan melalui aliran data default yang sebelumnya ditautkan, melainkan file baru yang kami buka.
Jadi ya, kita bisa memetakan FD 0
, 1
atau 2
ke salah satu file dan tidak perlu stdin
, stdout
atau stderr