( Https://stackoverflow.com/questions/13718394/what-should-interactive-shells-do-in-orphaned-process-groups adresindeki öneri uyarınca unix olarak yeniden gönderme )
Kısa soru şudur: Bir kabuk, tty'ye sahip olmayan yetim bir süreç grubundaysa ne yapmalıdır? Ama uzun soruyu okumanızı tavsiye ederim çünkü eğlenceli.
İşte en sevdiğiniz kabuğu kullanarak dizüstü bilgisayarınızı taşınabilir bir ısıtıcıya dönüştürmenin eğlenceli ve heyecan verici bir yolu (bu tcsh weirdos'tan biri değilseniz):
#include <unistd.h>
int main(void) {
if (fork() == 0) {
execl("/bin/bash", "/bin/bash", NULL);
}
return 0;
}
Bu, bash'ın CPU'yu% 100 oranında sabitlemesine neden olur. zsh ve balık da aynısını yapar, ksh ve tcsh iş kontrolü hakkında bir şeyler mırıldanır ve sonra sallanır, ki bu biraz daha iyi, ama çok değil. Oh, ve bu platform agnostik bir suçlu: OS X ve Linux da etkileniyor.
Aşağıdaki gibi Benim (potansiyel olarak yanlış) açıklaması: çocuk kabuk ön planda değildir algılar: tcgetpgrp(0) != getpgrp()
. Bu nedenle kendini durdurmaya çalışır: killpg(getpgrp(), SIGTTIN)
. Ancak süreç grubu yetim kalmıştır, çünkü ebeveyni (C programı) liderdi ve öldü ve SIGTTIN
yetimsiz bir süreç grubuna gönderildi sadece düştü (aksi takdirde hiçbir şey tekrar başlayamaz). Bu nedenle, çocuk kabuğu durdurulmaz, ancak hala arka plandadır, bu yüzden hemen tekrar yapar. Durulayın ve tekrarlayın.
Benim sorum, bir komut satırı kabuğu bu senaryoyu nasıl algılayabilir ve bunun için doğru olan şey nedir? Her ikisi de ideal olan iki çözümüm var:
- Pid'i grup kimliğimizle eşleşen işleme işaret etmeye çalışın. Bu başarısız olursa
ESRCH
, muhtemelen yetim olduğumuz anlamına gelir. - Bir baytın engellenmeyen bir okumasını deneyin
/dev/tty
. Bu başarısız olursaEIO
, muhtemelen yetim olduğumuz anlamına gelir.
(Bunu izleme sorunumuz https://github.com/fish-shell/fish-shell/issues/422 )
Düşünceleriniz için teşekkürler!