GNU/Linux >> Belajar Linux >  >> Linux

Portabilitas Tautan File Descriptor?

Saya selalu bertanya-tanya tentang hal ini tetapi tidak pernah meluangkan waktu untuk mencari tahu, jadi saya akan melakukannya sekarang – seberapa portabel penggunaan yang ditampilkan di sini dari /proc/$$/fd/$N atau /dev/fd/$N ? Saya mengerti POSIX menjamin /dev/null, /dev/tty, and /dev/console (walaupun saya baru mengetahuinya beberapa hari yang lalu setelah membaca komentar pada jawaban ini) tapi bagaimana dengan yang lain ini?

Sejauh yang saya tahu mereka cukup umum, tetapi dalam sistem apa saya tidak berharap untuk menemukan mereka? Kenapa tidak? Apakah lebih mungkin untuk menemukan satu daripada yang lain? Apakah mereka akan selalu menunjukkan atribut serupa?

Saya cenderung menggunakan perangkat ini secara ekstensif dalam segala hal, dan saya ingin tahu apakah ada kemungkinan saya akan gagal hanya dengan mencoba.

Juga pertanyaan di atas harus dipahami hanya apa yang saya pikirkan Saya ingin tahu, tetapi, karena saya jelas harus bertanya sejak awal, saya mungkin tidak tahu yang terbaik dalam hal ini dan mereka tidak boleh dianggap sebagai persyaratan yang ketat untuk sebuah jawaban. Tolong beri tahu saya jika Anda bisa.

Jawaban yang Diterima:

/proc/PID/fd/NUM symlink adalah quasi-universal di Linux, tetapi tidak ada di tempat lain (kecuali di Cygwin yang mengemulasinya). /proc/PID/fd/NUM juga ada di AIX dan Solaris, tetapi mereka bukan symlink. Secara portabel, untuk mendapatkan informasi tentang file yang terbuka, instal lsof .

Unice dengan /proc/PID/fd

Linux

Di Linux, /proc/PID/fd/NUM adalah tautan simbolis yang sedikit ajaib ke file yang diproses dengan ID PID telah terbuka pada deskriptor file NUM . Tautan ini ajaib karena, misalnya, dapat digunakan untuk mengakses file bahkan jika file tersebut dihapus. Tautan akan melacak file melalui penggantian nama juga. /proc/self adalah tautan simbolis ajaib yang menunjuk ke /proc/PID dimana PID adalah proses yang mengakses tautan.

Fitur ini hadir di hampir semua sistem Linux. Ini disediakan oleh driver untuk sistem file proc, yang secara teknis opsional tetapi digunakan untuk banyak hal (termasuk membuat ps work — dibaca dari /proc/PID ) yang hampir tidak pernah ditinggalkan bahkan pada sistem yang disematkan.

Cygwin

Cygwin mengemulasi /proc/PID/fd/NUM (untuk proses Cygwin) dan /proc/self .

Solaris (sejak versi 2.6), AIX

Ada /proc/PID/fd entri untuk setiap deskriptor file, tetapi mereka muncul sebagai tipe yang sama dengan file yang dibuka, sehingga mereka tidak memberikan informasi tentang jalur file. Namun mereka melaporkan stat yang sama informasi sebagai fstat akan melaporkan ke proses yang membuka file, jadi dimungkinkan untuk menentukan di sistem file mana file itu berada dan nomor inodenya. Direktori muncul sebagai tautan simbolik, namun itu adalah symlink ajaib yang hanya dapat diikuti, dan readlink mengembalikan string kosong.

Di bawah AIX, procfiles perintah menampilkan beberapa informasi tentang file proses yang terbuka. Di bawah Solaris, pfiles perintah menampilkan beberapa informasi tentang file proses yang terbuka. Ini tidak termasuk jalur ke file (di Solaris, sejak Solaris 10, lihat di bawah).

Solaris (sejak versi 10)

Selain /proc/PID/fd/NUM , versi Solaris modern memiliki /proc/PID/path/NUM yang berisi tautan simbolik yang mirip dengan symlink Linux di /proc/PID/fd/NUM . pfiles perintah menunjukkan informasi tentang file proses yang terbuka, termasuk jalur.

Rencana9

/proc/PID/fd adalah file teks yang berisi satu record (baris) per deskriptor file yang dibuka oleh proses. Nama file tidak terlacak di sana.

Terkait:Ekstrak nama file dari jalur di program awk?

QNX

/proc/PID/ adalah direktori, tetapi tidak berisi informasi apa pun tentang deskriptor file.

Unice dengan /proc tetapi tidak ada akses langsung ke deskriptor file

(Catatan:kadang-kadang dimungkinkan untuk memperoleh informasi tentang file yang terbuka dari suatu proses dengan mengobrak-abrik gambar memorinya yang dapat diakses di bawah /proc . Saya tidak menghitungnya sebagai “akses langsung”.)

Unice di mana /proc/PID adalah file

Sistem file proc itu sendiri dimulai pada edisi ke-8 UNIX, tetapi dengan struktur yang berbeda, dan melalui Rencana 9 dan kembali ke beberapa unix. Saya rasa semua sistem operasi dengan /proc memiliki entri untuk setiap PID, tetapi pada banyak sistem, ini adalah file biasa, bukan direktori. Sistem berikut memiliki /proc/PID yang perlu dibaca dengan ioctl :

  • Solar hingga 2,5
  • OSF/1 sekarang dikenal sebagai Tru64
  • IRIX (?)
  • SCO (?)

MINIX 3

MINIX 3 memiliki server procfs yang menyediakan beberapa komponen mirip Linux termasuk /proc/PID/ direktori. Namun tidak ada /proc/PID/fd .

FreeBSD

FreeBSD memiliki /proc/PID/ direktori, tetapi mereka tidak memberikan informasi tentang deskriptor file terbuka. (Namun ada /proc/PID/file yang mirip dengan /proc/PID/exe , memberikan akses ke file yang dapat dieksekusi melalui tautan simbolis.)

Procfs FreeBSD tidak digunakan lagi.

Unice tanpa /proc

  • HP-UX
  • OpenBSD
  • NetBSD
  • Mac OS X

Mengarsipkan informasi deskriptor melalui saluran lain

Fuser

fuser perintah mencantumkan proses yang membuka file tertentu, atau file terbuka pada titik pemasangan yang ditentukan. Perintah ini standar (tersedia di semua sistem yang mendukung XSI, yaitu POSIX dengan X/Open System Interface Extension).

Anda tidak dapat beralih dari proses ke nama file dengan utilitas ini.

Lsof

Lsof adalah singkatan dari "daftar file yang terbuka". Ini adalah alat pihak ketiga, tersedia (tetapi biasanya bukan bagian dari instalasi default) untuk sebagian besar varian unix. Memperoleh informasi tentang file yang terbuka sangat bergantung pada sistem, karena analisis di atas mungkin membuat Anda curiga. Pengelola lsof telah melakukan pekerjaan menggabungkan semuanya di bawah satu antarmuka.

Anda dapat membaca FAQ untuk melihat kesulitan apa yang harus dihadapi lsof. Pada kebanyakan unice, memperoleh informasi tentang nama file yang terbuka memerlukan penguraian struktur data kernel. Mengutip dari FAQ 3.3 “Mengapa lsof tidak melaporkan nama path lengkap?”:

Lsof tidak dapat memperoleh komponen nama jalur dari cache nama kernel dari dialek berikut:

  • AIX

Hanya kernel Linux yang mencatat nama path lengkap dalam struktur yang dikelolanya tentang file yang terbuka; sebagai gantinya, sebagian besar kernel mengonversi nama jalur ke perangkat dan nomor simpul ganda dan menggunakannya untuk referensi file berikutnya setelah file dibuka.

Jika Anda perlu mengurai informasi dari lsof 's output, pastikan untuk menggunakan -F mode (satu bidang per baris), sebaiknya -F0 mode (bidang yang dibatasi nol). Untuk mendapatkan informasi tentang deskriptor file tertentu dari proses tertentu, gunakan -a opsi dengan -p PID dan -d NUM , misalnya lsof -a -p 123 -d 0 -F0n .

/dev/fd/NUM untuk deskriptor file dari proses saat ini

Banyak varian unix menyediakan cara bagi suatu proses untuk mengakses file yang terbuka melalui nama file:membuka /dev/fd/NUM sama dengan memanggil dup(NUM) . Nama-nama ini berguna ketika sebuah program menginginkan nama file tetapi Anda ingin meneruskan file yang sudah terbuka (misalnya pipa atau soket); misalnya shell yang mengimplementasikan substitusi proses menggunakannya jika tersedia (menggunakan pipa bernama sementara di mana /dev/fd tidak tersedia).

Dimana /dev/fd ada, juga biasanya (selalu?) sinonim (terkadang tautan simbolik, terkadang tautan keras, terkadang file ajaib dengan properti yang setara) /dev/stdin =/dev/fd/0 , /dev/stdout =/dev/fd/1 , /dev/stderr =/dev/fd/2 .

  • Di Linux, /dev/fd adalah tautan simbolis ke /proc/self/fd .
  • Di sebagian besar unices (IRIX, OpenBSD, NetBSD, SCO, Solaris, …), entri di /dev/fd adalah perangkat karakter. Mereka biasanya muncul apakah deskriptor file terbuka atau tidak, dan entri mungkin tidak tersedia untuk deskriptor file di atas angka tertentu.
  • Di bawah FreeBSD dan OSX, sistem file fdescfs menyediakan /dev/fd dinamis direktori yang mengikuti deskriptor terbuka dari proses pemanggilan. /dev/fd statis tersedia jika /dev/fd tidak dipasang.
  • Di bawah OSF/1 (Tru64), /dev/fd disediakan melalui fdfs.
  • Tidak ada /dev/fd di AIX atau HP-UX.
Terkait:Apakah mungkin untuk mendapatkan karakter di kursor terminal menggunakan kode pelarian ANSI?
Linux
  1. Tautan keras dan tautan lunak di Linux dijelaskan

  2. Apa itu Tautan Lunak dan Tautan Keras di Sistem File Linux

  3. Ambil nama file dari deskriptor file di C

  1. Bagaimana cara kerja batas deskriptor file linux?

  2. PID maksimum di Linux

  3. Cara teraman untuk menutup paksa deskriptor file

  1. Perbedaan Antara Tautan Simbolik dan Tautan Keras?

  2. Echo To File Descriptor Menimpa File?

  3. Mengelola Duplikat Cron Job Saat Menjalankan Skrip