Portabilitas tautan deskriptor file

20

Saya selalu bertanya-tanya ini tetapi tidak pernah mengambil waktu untuk mencari tahu, jadi saya akan melakukannya sekarang - bagaimana portabel penggunaan ditampilkan di sini baik /proc/$$/fd/$Natau /dev/fd/$N? Saya mengerti jaminan POSIX /dev/null, /dev/tty, and /dev/console (walaupun saya baru tahu kemarin setelah membaca komentar tentang jawaban ini ) tetapi bagaimana dengan yang lain?

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

Saya cenderung menggunakan perangkat ini cukup luas dalam segala hal, dan saya ingin tahu apakah ada peluang saya akan gagal hanya mencoba.

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

mikeserv
sumber

Jawaban:

27

The symlink adalah kuasi universal di Linux, tetapi mereka tidak ada di tempat lain (kecuali pada Cygwin yang mengemulasi mereka). juga ada di AIX dan Solaris, tetapi mereka bukan symlinks. Portable, untuk mendapatkan informasi tentang file yang terbuka, instal ./proc/PID/fd/NUM/proc/PID/fd/NUMlsof

Bersatu dengan /proc/PID/fd

Linux

Di Linux, ada tautan simbolis yang agak ajaib ke file yang prosesnya dibuka dengan ID PID pada deskriptor file NUM . Tautan ini ajaib karena, misalnya, dapat digunakan untuk mengakses file bahkan jika file tersebut dihapus. Tautan juga akan melacak file melalui penggantian nama. adalah tautan simbolis ajaib yang menunjukkan ke mana PID adalah proses yang mengakses tautan./proc/PID/fd/NUM/proc/self/proc/PID

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 pspekerjaan - itu dibaca dari ) yang hampir tidak pernah ditinggalkan bahkan pada sistem embedded./proc/PID

Cygwin

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

Solaris (sejak versi 2.6), AIX

Ada entri untuk setiap deskriptor file, tetapi mereka muncul sebagai jenis yang sama dengan file yang dibuka, sehingga mereka tidak memberikan informasi tentang path file. Namun mereka melaporkan informasi yang sama seperti akan melaporkan ke proses yang memiliki file terbuka, sehingga dimungkinkan untuk menentukan sistem file mana file itu berada dan nomor inode-nya. Direktori muncul sebagai tautan simbolik, namun mereka adalah symlink ajaib yang hanya dapat diikuti, dan mengembalikan string kosong./proc/PID/fdstatfstatreadlink

Di bawah AIX, procfilesperintah menampilkan beberapa informasi tentang file yang terbuka pada suatu proses. Di bawah Solaris, pfilesperintah menampilkan beberapa informasi tentang file terbuka suatu proses. Ini tidak termasuk path ke file (pada Solaris, itu sejak Solaris 10, lihat di bawah).

Solaris (sejak versi 10 )

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

Plan9

/proc/PID/fdadalah file teks yang berisi satu catatan (baris) per deskriptor file yang dibuka oleh proses. Nama file tidak dilacak di sana.

QNX

/proc/PID/ adalah direktori, tetapi tidak mengandung informasi tentang deskriptor file.

Unices dengan /proctetapi tanpa akses langsung ke deskriptor file

(Catatan: kadang-kadang dimungkinkan untuk mendapatkan informasi tentang file yang terbuka pada suatu proses dengan mengacak-acak gambar memorinya yang dapat diakses di bawah /proc. Saya tidak menganggap itu sebagai "akses langsung".)

Menyatukan tempat file/proc/PID

Sistem file proc sendiri dimulai dalam edisi UNIX 8, tetapi dengan struktur yang berbeda, dan pergi melalui Plan 9 dan kembali ke beberapa kesatuan. Saya pikir semua sistem operasi /procmemiliki entri untuk setiap PID, tetapi pada banyak sistem, ini adalah file biasa, bukan direktori. Sistem berikut memiliki yang perlu dibaca :/proc/PIDioctl

  • Solaris 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 direktori. Namun ini tidak ada ./proc/PID//proc/PID/fd

FreeBSD

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

Proksi FreeBSD sudah usang .

Unices tanpa /proc

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

File informasi deskriptor melalui saluran lain

Fuser

The fuserdaftar perintah proses yang memiliki file terbuka yang ditentukan, atau file terbuka pada yang ditentukan mount point. Perintah ini standar (tersedia pada semua sistem yang sesuai dengan XSI , yaitu POSIX dengan Ekstensi Antarmuka Sistem X / Terbuka).

Anda tidak dapat beralih dari proses untuk mengajukan nama dengan utilitas ini.

Lsof

Lsof adalah singkatan dari "daftar file terbuka". Ini adalah alat pihak ketiga , tersedia (tetapi biasanya bukan bagian dari instalasi default) untuk sebagian besar varian unix. Mendapatkan informasi tentang file terbuka sangat tergantung 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. Pada sebagian besar unices, mendapatkan informasi tentang nama file yang terbuka membutuhkan penguraian struktur data kernel. Mengutip dari FAQ 3.3 "Mengapa tidak melaporkan nama path lengkap?":

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

  • AIX

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

Jika Anda perlu mem-parsing informasi dari lsofkeluaran, pastikan untuk menggunakan -Fmode (satu bidang per baris), lebih disukai -F0mode (bidang-bidang yang dibatasi-nol). Untuk mendapatkan informasi tentang deskriptor file spesifik dari proses tertentu, gunakan -aopsi dengan dan , misalnya .-p PID-d NUMlsof -a -p 123 -d 0 -F0n

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

Banyak varian unix menyediakan cara bagi proses untuk mengakses file yang terbuka melalui nama file: pembukaan sama dengan panggilan . Nama-nama ini berguna ketika suatu program menginginkan nama file tetapi Anda ingin meneruskan file yang sudah terbuka (mis. Pipa atau soket); misalnya cangkang yang menerapkan proses substitusi menggunakannya di mana tersedia (menggunakan pipa bernama sementara di mana tidak tersedia)./dev/fd/NUMdup(NUM)/dev/fd

Di mana /dev/fdada, biasanya ada sinonim (selalu?) (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/fdada tautan simbolis ke /proc/self/fd.
  • Di bawah sebagian besar unix ( IRIX , OpenBSD , NetBSD , SCO, Solaris , ...), entri dalam /dev/fdadalah 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, filesystem fdescfs menyediakan /dev/fddirektori dinamis yang mengikuti deskriptor terbuka dari proses pemanggilan. Statis /dev/fdtersedia /dev/fdtidak terpasang.
  • Di bawah OSF / 1 (Tru64), /dev/fddisediakan melalui fdfs .
  • Tidak ada /dev/fdpada AIX atau HP-UX.
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Pernyataan Anda tentang Solaris agak ketinggalan jaman. Dengan rilis Solaris kurang dari 10 tahun, pfilesperintah tersebut menunjukkan path deskriptor file. Itu mengambil informasi ini dari /proc/<pid>/pathdirektori yang mungkin juga Anda sebutkan. Lihat docs.oracle.com/cd/E19253-01/817-0547/esxiq/index.html
jlliagre
9

Cara /procini diterapkan dan fitur yang disediakannya tidak standar dengan cara apa pun, lihat misalnya di sini . Menurut Wikipedia, FreeBSD sedang "dihapus" /proc, lihat di sini untuk detailnya .

Pada /dev, /dev/fd/bukan merupakan bagian dari POSIX atau Spesifikasi Pengguna Tunggal (SUSv3) sementara Sistem V dan BSD mendukungnya.

Tambahan:

Linux: /dev/fd/*adalah symlinks ke /proc/self/fd.

FreeBSD: /dev/fd/*disediakan melalui fdescfs.

NetBSD: sama seperti FreeBSD.

OpenBSD: sama dengan FreeBSD.

Solaris: telah /dev/fd/*.

IRIX: telah /dev/fd/*.

Tru64 Unix: /dev/fd/*menurut nixdoc.net , dokumentasi Tru64 asli di HP tidak dapat dipahami (bocah, sungguh kacau! Anda tidak menemukan apa-apa!).

AIX: tidak ada indikasi yang ditemukan dari dokumentasi yang tersedia untuk umum.

HP-UX: sama dengan AIX.

countermode
sumber
Jadi saya akan menemukan /dev/fd/1pada BSD yang terhubung ke arus saya 1>? Satu hal yang biasa saya lakukan di linux adalah echo 'command' | . /dev/fd/0- apakah hal seperti ini mungkin bekerja secara menyeluruh, menurut Anda?
mikeserv
Saya belum memiliki akses ke sistem BSD sekarang, tapi begitulah saya memahaminya, ya.
countermode
1
Jika Anda pernah menemukan waktu hanya untuk memperluas itu hanya sedikit lagi saya akan menerima jawaban ini, saya pikir, kecuali ada posting proffd kejutan, yaitu. Bagaimanapun artikel pertama yang ditautkan adalah bacaan yang mencerahkan - terima kasih banyak.
mikeserv
Ya. Saya kira prof fd muncul setelah semua, ya? Jadi, lebih baik beruntung lain kali?
mikeserv
1
Baiklah kalau begitu. Linux: / dev / fd / * adalah symlink ke / proc / self / fd. FreeBSD: / dev / fd / * disediakan melalui fdescfs. NetBSD: sama seperti FreeBSD. OpenBSD: sama dengan FreeBSD. Solaris: memiliki / dev / fd / *. IRIX: memiliki / dev / fd / *. Tru64 Unix: has / dev / fd / * (menurut nixdoc.net , dokumentasi Tru64 asli di HP tidak dapat dipahami). AIX: tidak ada indikasi yang ditemukan dari dokumentasi yang tersedia untuk umum. HP-UX: sama dengan AIX.
countermode