Sistem mirip Unix mana yang benar-benar menyediakan file khusus / dev / tcp?

9

Saya tahu /dev/tcp/<host>/<port>adalah jalur ajaib yang ditangani secara khusus oleh beberapa kerang dalam pengalihan. Tetapi menurut man bash:

Jika sistem operasi tempat bash menjalankan menyediakan file-file khusus ini, bash akan menggunakannya; selain itu akan meniru mereka secara internal [...]

Pada kotak Linux yang saya gunakan saat ini, /dev/tcpfile khusus tidak ada, sehingga Bash akan meniru itu. Tapi, apakah sebenarnya ada sistem mirip Unix yang menyediakan /dev/tcpfile khusus dengan semantik yang sama dengan yang didukung oleh Bash?

Sylvain Leroux
sumber
Itu akan membutuhkan direktori yang ditiru. Membuat direktori yang diemulasikan hanya dimungkinkan dengan sistem file tertentu, misalnya procfs atau sysfs dapat melakukannya. /devadalah tmpfs di linux saat ini, dan itu di partisi root di yang lebih lama. Inilah sebabnya mengapa saat ini mustahil. Itu dapat dibuat dengan mudah dengan ekstensi sysfs atau procfs (keduanya fs sangat fleksibel dan serupa (sebenarnya mungkin tidak ada yang tahu mengapa mereka tidak sama)), tidak ada yang melakukannya hari ini, tetapi bisa dibuat di sekitar 100 baris kode.
peterh
Tetapi apakah ada OS lain yang sudah melakukannya? Pada titik tertentu, saya pikir Plan 9 melakukannya tetapi saya salah.
Sylvain Leroux
1
Saya tidak tahu, mungkin tidak (sejauh yang saya tahu, ini adalah penemuan bash). Saya memilih pertanyaan Anda, karena jawabannya juga menarik bagi saya. Sejauh yang saya tahu, tidak ada OS unix berkemampuan x86 yang populer yang dapat melakukan ini.
peterh

Jawaban:

8

Saya pikir dokumentasi Bash agak menyesatkan pada topik ini. Melihat kode, bahkan kembali ke versi 2.04 di mana pengalihan jaringan diperkenalkan, /dev/tcpdan /dev/udpberfungsi sebagai berikut:

  • pada saat membangun, configureskrip memeriksa untuk melihat apakah berbagai fitur jaringan didukung; jika demikian, jika pengalihan jaringan diaktifkan (yang merupakan kasus secara default), kode jaringan internal dibangun;
  • pada saat dijalankan, jika kode jaringan internal sudah terpasang, /dev/tcpdan /dev/udp(dalam format yang tepat) ditangani secara internal; jika tidak, peringatan dihasilkan (“/ dev / (tcp | udp) / host / port tidak didukung tanpa jaringan”) dan Bash mencoba untuk membuka jalur yang diberikan pada sistem;
  • jika pengalihan jaringan dikonfigurasi, tidak ada yang dilakukan khusus.

Intinya adalah:

  • jika pengalihan jaringan diaktifkan:
    • jika jaringan didukung pada platform target, /dev/tcpdan /dev/udpakan selalu ditangani secara internal;
    • jika tidak, Bash akan memperingatkan dan mencoba untuk membuka file "secara membabi buta"; jika sistem entah bagaimana mendukung /dev/(tcp|udp)/host/port, itu akan digunakan, jika tidak maka kemungkinan pengalihan akan gagal;
  • jika pengalihan jaringan dinonaktifkan, tidak ada penanganan khusus yang dilakukan; seperti di atas, jika sistem entah bagaimana mendukung /dev/(tcp|udp)/host/port, yang akan digunakan, jika tidak, kemungkinan redirection akan gagal.

/dev/tcpmemang ada pada beberapa sistem, tetapi sejauh yang saya tahu tidak ada yang mendukung abstraksi yang sama seperti Bash. Pada Solaris, /dev/tcpdigunakan dengan nddalat untuk mencari dan mengubah konfigurasi jaringan. Di XTI (lihat juga Grup Terbuka jika Anda adalah anggota), t_openfungsinya dapat digunakan /dev/tcpuntuk membuka koneksi TCP, tetapi tidak menggunakan pengaturan berbasis jalur, ada struktur data terpisah untuk menentukan host target dan port (dan parameter lainnya).

Stephen Kitt
sumber
Fitur itu sendiri berasal dari ksh93. / dev / tcp pada sistem SysV akan menjadi pegangan pada modul STREAMS tcp.
Stéphane Chazelas