Spec POSIX benar-benar melakukan lindung nilai taruhannya di mana Terminal Pengendali terkait, dan yang didefinisikan sebagai berikut:
- Mengontrol Terminal
- Pertanyaan yang mana dari beberapa file khusus yang merujuk ke terminal yang dimaksud tidak dibahas dalam POSIX.1. Pathname
/dev/tty
adalah sinonim untuk terminal pengendali yang terkait dengan suatu proses.
Itu ada dalam daftar Definisi - dan hanya itu yang ada di sana. Namun dalam General Terminal Interface , beberapa kata:
Terminal dapat menjadi bagian dari suatu proses sebagai terminal pengendali. Setiap proses sesi yang memiliki terminal pengendali memiliki terminal pengendali yang sama. Terminal mungkin merupakan terminal pengendali untuk paling banyak satu sesi. Terminal pengendali untuk suatu sesi dialokasikan oleh pemimpin sesi dengan cara yang ditentukan implementasi. Jika pemimpin sesi tidak memiliki terminal pengendali, dan membuka file perangkat terminal yang belum dikaitkan dengan sesi tanpa menggunakan opsi O_NOCTTY (lihat buka ()), itu ditentukan implementasi apakah terminal menjadi terminal pengendali sesi pemimpin.
Terminal pengendali diwarisi oleh proses anak selama panggilan fungsi fork (). Suatu proses melepaskan terminal pengendali ketika membuat sesi baru dengansetsid()
fungsi; proses lain yang tersisa di sesi lama yang memiliki terminal ini sebagai terminal pengendali mereka terus memilikinya. Setelah penutupan deskriptor file terakhir dalam sistem (apakah itu dalam sesi saat ini atau tidak) yang terkait dengan terminal pengendali, tidak ditentukan apakah semua proses yang memiliki terminal itu sebagai terminal pengendali berhenti memiliki terminal pengendali. Apakah dan bagaimana pemimpin sesi dapat memperoleh kembali terminal pengendali setelah terminal pengendali dilepaskan dengan cara ini tidak ditentukan. Suatu proses tidak melepaskan terminal pengendali hanya dengan menutup semua deskriptor file yang terkait dengan terminal pengendali jika proses lain terus membukanya.
Masih banyak yang belum ditentukan - dan jujur saya pikir itu masuk akal. Walaupun terminal adalah antarmuka pengguna utama, terminal juga semua jenis hal lain dalam beberapa kasus - seperti perangkat keras yang sebenarnya, atau bahkan jenis printer - tetapi dalam banyak kasus itu hampir tidak ada sama sekali - seperti terminal xterm
yang hanya merupakan emulator . Sulit untuk mendapatkan spesifik di sana - dan saya tidak berpikir itu akan banyak demi kepentingan Unix, karena terminal melakukan lebih banyak daripada Unix.
Bagaimanapun, POSIX juga cukup rapuh tentang bagaimana ps
seharusnya berperilaku di mana ctty bersangkutan.
Itu -a
saklarnya:
- Tulis informasi untuk semua proses yang terkait dengan terminal. Implementasi dapat menghilangkan pemimpin sesi dari daftar ini.
Bagus. Pemimpin sesi dapat dihilangkan. Itu tidak terlalu membantu.
Dan -t
:
- Tulis informasi untuk proses yang terkait dengan terminal yang diberikan dalam termlist. Aplikasi harus memastikan bahwa termlist adalah argumen tunggal dalam bentuk
<blank>
daftar yang dipisahkan oleh koma. Pengidentifikasi terminal harus diberikan dalam format yang ditentukan implementasi .
... yang merupakan kekecewaan lainnya. Tapi itu terus mengatakan ini tentang sistem XSI:
- Pada sistem yang sesuai dengan XSI, mereka harus diberikan dalam salah satu dari dua bentuk: nama file perangkat (misalnya,
tty04
) atau, jika nama file perangkat dimulai dengan tty
, hanya pengidentifikasi yang mengikuti karakter tty
(misalnya, 04
) .
Itu sedikit lebih baik, tetapi bukan jalan. Juga pada sistem XSI ada -d
saklar:
- Tulis informasi untuk semua proses, kecuali pemimpin sesi.
... yang setidaknya jelas. Anda dapat menentukan -o
saklar utput juga dengan tty
string format, tetapi, seperti yang telah Anda catat, format outputnya ditentukan oleh implementasi. Namun, saya pikir itu sama baiknya dengan yang didapat. Saya berpikir bahwa - dengan banyak pekerjaan - sakelar di atas dikombinasikan dengan beberapa utilitas lain dapat membuat Anda rata-rata yang bagus. Jujur saja, saya tidak tahu kapan / bagaimana hal itu merusak Anda - dan saya belum bisa membayangkan situasi di mana itu akan terjadi. Tapi, saya pikir mungkin jika kita menambahkan fuser
dan find
kita dapat memverifikasi jalurnya.
exec 2<>/dev/null
ctty=$(sh -c 'ps -p "$$" -o tty=' <&2)
sid=$(sh -c 'ps -Ao pid= -o tty=|
grep '"$ctty$"' |
grep -Fv "$(ps -do pid=)"' <&2)
find / -type c -name "*${ctty##*/}*" \
-exec fuser -uv {} \; 2>&1 |
grep ".*$ctty.*${sid%%"$ctty"*}"
Hal /dev/null
itu hanya untuk menunjukkan bahwa itu bisa bekerja ketika tidak ada subkulit pencarian yang memiliki 0,1,2 yang terhubung ke ctty. Bagaimanapun, itu mencetak:
/dev/pts/3: mikeserv 3342 F.... (mikeserv)zsh
Sekarang yang di atas mendapatkan jalur penuh pada mesin saya, dan saya membayangkan hal itu akan terjadi pada kebanyakan orang. Saya juga bisa membayangkan itu bisa gagal. Itu hanya heuristik kasar.
Ini mungkin gagal karena banyak alasan lain mungkin, tetapi jika Anda berada di sistem yang memungkinkan ketua sesi untuk melepaskan semua deskriptor ke ctty dan tetap sebagai sid maka sebagai spec memungkinkan, maka ini jelas tidak akan membantu. Yang mengatakan, saya pikir ini bisa mendapatkan perkiraan yang cukup bagus dalam banyak kasus.
Tentu saja yang paling mudah hal yang harus dilakukan jika Anda memiliki setiap deskriptor terhubung ke CTTY Anda hanya ...
tty <&2
... atau serupa.
ps
solusinya mencakup sebagian besar sistem (danwho
tidak membantu lebih darips
), mungkin dengan kode sedikit lebih untuk menangani pengidentifikasi saja (seperti "04"). Saya bertanya-tanya apakah ada solusi yang lebih portabel.