GNU/Linux >> Belajar Linux >  >> Linux

Mungkinkah deskriptor file linux 0 1 2 bukan untuk stdin, stdout dan stderr?

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


Linux
  1. Cara Mengarahkan Output ke File dan Stdout di Linux

  2. Seberapa Portabel /dev/stdin, /dev/stdout Dan /dev/stderr?

  3. sed in-place flag yang berfungsi baik di Mac (BSD) dan Linux

  1. Di Linux, apakah mungkin untuk mengenkripsi folder/partisi sedemikian rupa sehingga tidak dapat diakses oleh siapa pun tanpa kata sandi?

  2. Apakah mungkin untuk menyimpan konten konsol virtual Linux dan scrollback dalam sebuah file?

  3. bash:redirect stderr ke file dan stdout + stderr ke layar

  1. Linux – Apakah Mungkin Memalsukan Jalur Tertentu Untuk Suatu Proses?

  2. Tampilkan Hanya Stderr Di Layar Tetapi Tulis Stdout Dan Stderr Ke File?

  3. Menangkap STDERR dan STDOUT ke file menggunakan tee