POSIX spesifikasyonu, gerçekten Kontrol Terminali söz konusu olduğunda ve bu şekilde tanımladığı bahislerini korur:
- Kontrol Terminali
- Terminale atıfta bulunan birkaç özel dosyadan hangisinin kastedildiği sorusu POSIX.1'de ele alınmamıştır. Yol adı
/dev/tty
, bir işlemle ilişkili kontrol terminali ile eşanlamlıdır.
Tanımlar listesinde budur - ve hepsi oradadır. Ancak Genel Terminal Arayüzü'nde daha fazlası söyleniyor:
Bir terminal, kontrol terminali olarak bir sürece ait olabilir. Bir kontrol terminali olan bir oturumun her işlemi aynı kontrol terminaline sahiptir. Bir terminal, en fazla bir oturum için kontrol terminali olabilir. Bir oturum için kontrol terminali, oturum lideri tarafından uygulama tanımlı bir şekilde tahsis edilir. Bir oturum liderinin kontrol terminali yoksa ve O_NOCTTY seçeneğini kullanmadan bir oturumla ilişkilendirilmemiş bir terminal cihazı dosyası açarsa (bkz. Open ()), terminalin oturumun kontrol terminali olup olmadığı uygulama tanımlıdır Önder.
Kontrol terminali fork () fonksiyon çağrısı sırasında bir alt süreç tarafından miras alınır. Bir işlem, kontrol terminalini yeni bir oturum oluşturduğundan vazgeçirir.setsid()
fonksiyonu; kontrol terminalleri olarak bu terminali kullanan eski oturumda kalan diğer işlemler devam eder. Kontrol terminali ile ilişkili sistemdeki son dosya tanımlayıcısının (mevcut oturumda olsun ya da olmasın) kapatılması üzerine, kontrol terminali olarak o terminale sahip olan tüm işlemlerin herhangi bir kontrol terminaline sahip olup olmadığı belirtilmez. Bir oturum liderinin, kontrol terminali bu şekilde bırakıldıktan sonra bir kontrol terminalini tekrar alıp almayacağı ve nasıl belirtileceği belirtilmemiştir. Bir işlem, diğer işlemler açılmaya devam ederse, kontrol terminalini kontrol terminaliyle ilişkili tüm dosya tanımlayıcılarını kapatarak bırakmaz.
Orada belirtilmemiş çok şey var - ve dürüstçe bunun mantıklı olduğunu düşünüyorum. Terminal önemli bir kullanıcı arayüzü olsa da, bazı durumlarda gerçek donanım, hatta bir tür yazıcı gibi diğer şeyler de vardır, ancak çoğu durumda pratik olarak hiçbir şey yoktur - xterm
sadece bir emülatör gibi . Orada spesifik olmak zor - ve zaten Unix'in çıkarına çok fazla olacağını sanmıyorum, çünkü terminaller Unix'ten çok daha fazlasını yapıyor.
Her neyse, POSIX, ps
ctty'nin söz konusu olduğu yerde nasıl davranması gerektiği konusunda da oldukça havalı.
Orada -a
anahtarı:
- Terminallerle ilişkili tüm işlemler için bilgi yazın. Uygulamalar oturum liderlerini bu listeden çıkarabilir.
Harika. Oturum liderleri olabilir atlanabilir. Bu çok yardımcı değil.
Ve -t
:
- Terim listesinde verilen terminallerle ilişkili işlemler için bilgi yazın. Başvuru, terim
<blank>
listesinin bir veya virgülle ayrılmış liste biçiminde tek bir argüman olmasını sağlamalıdır . Terminal tanımlayıcıları uygulama tanımlı bir formatta verilmelidir .
... başka bir hayal kırıklığı. Ama bunu XSI sistemleri hakkında söylemeye devam ediyoruz:
- XSI uyumlu sistemlerde, bunlar iki formdan birinde verilmelidir: aygıtın dosya adı (örneğin
tty04
) veya aygıtın dosya adı ile başlarsa tty
, yalnızca karakterleri izleyen tanımlayıcı tty
(örneğin 04
) .
Bu biraz daha iyi, ama bir yol değil. Ayrıca XSI sistemlerinde -d
anahtar vardır:
- Oturum liderleri hariç tüm süreçler için bilgi yazın.
... en azından açık olan. -o
Utput anahtarını tty
biçim dizesiyle de belirtebilirsiniz , ancak belirttiğiniz gibi çıktı biçimi uygulama tanımlıdır. Yine de, olabildiğince iyi olduğunu düşünüyorum. Bence - çok fazla çalışma ile - diğer bazı yardımcı programlarla birlikte yukarıdaki anahtarlar size oldukça iyi bir basketbol sahası elde edebilir. Yine de dürüst olmak gerekirse, sizin için ne zaman / nasıl kırıldığını bilmiyorum - ve içinde olacağı bir durumu hayal edemedim. Ancak, muhtemelen eklersek fuser
ve find
yolu doğrulayabilirsek düşünüyorum .
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"*}"
/dev/null
Şeyler aramaya altkabuklarda hiçbiri ctty bağlı 0,1,2 herhangi varken işe yarayabilir göstermek içindi. Her neyse, yazdırır:
/dev/pts/3: mikeserv 3342 F.... (mikeserv)zsh
Şimdi yukarıdakiler makinemde tam yolu alıyor ve çoğu durumda çoğu insan için olacağını düşünüyorum. Başarısız olabileceğini de hayal edebiliyorum. Sadece kaba sezgisel tarama.
Bu muhtemelen başka birçok nedenden dolayı başarısız olabilir, ancak oturum liderinin tüm tanımlayıcıları ctty'ye bırakmasına ve spesifikasyonun izin verdiği şekilde sid olarak kalmasına izin veren bir sistemdeyseniz, bu kesinlikle yardımcı olmayacaktır. Bununla birlikte, çoğu durumda bunun oldukça iyi bir tahmin alabileceğini düşünüyorum.
Elbette ctty'nize bağlı herhangi bir tanımlayıcı varsa yapmak için en kolay şey sadece ...
tty <&2
...veya benzeri.
ps
çözüm çoğu sistemi kapsar (vewho
daha fazla yardımcı olmazps
), muhtemelen tanımlayıcı tek başına ("04" gibi) işlemek için biraz daha fazla kod ile. Daha taşınabilir bir çözüm olup olmadığını merak ediyordum.