(Posting ulang di unix sesuai saran di /programming/13718394/what-should-interactive-shells-do-in-orphaned-process-groups )
Pertanyaan singkatnya adalah, apa yang harus dilakukan shell jika berada dalam grup proses yatim yang tidak memiliki tty? Tapi saya sarankan membaca pertanyaan panjang karena itu lucu.
Berikut ini adalah cara yang menyenangkan dan menarik untuk mengubah laptop Anda menjadi pemanas ruang portabel, menggunakan cangkang favorit Anda (kecuali Anda salah satu dari orang aneh tcsh):
#include <unistd.h>
int main(void) {
if (fork() == 0) {
execl("/bin/bash", "/bin/bash", NULL);
}
return 0;
}
Ini menyebabkan bash untuk mematok CPU pada 100%. zsh dan ikan melakukan hal yang sama, sementara ksh dan tcsh menggumamkan sesuatu tentang kontrol pekerjaan dan kemudian melunasi, yang sedikit lebih baik, tetapi tidak banyak. Oh, dan itu adalah pelaku platform agnostik: OS X dan Linux sama-sama terpengaruh.
Saya (berpotensi salah) penjelasan adalah sebagai berikut: shell anak mendeteksi tidak di latar depan: tcgetpgrp(0) != getpgrp()
. Oleh karena itu mencoba untuk menghentikan sendiri: killpg(getpgrp(), SIGTTIN)
. Tetapi grup prosesnya adalah yatim piatu, karena induknya (program C) adalah pemimpin dan meninggal, dan SIGTTIN
dikirim ke grup proses yatim hanya dibatalkan (jika tidak, tidak ada yang bisa memulainya lagi). Oleh karena itu, shell anak tidak berhenti, tetapi masih di latar belakang, jadi ia melakukan semuanya lagi, segera. Bilas dan ulangi.
Pertanyaan saya adalah, bagaimana shell baris perintah dapat mendeteksi skenario ini, dan apa hal yang benar untuk dilakukan? Saya punya dua solusi, yang keduanya tidak ideal:
- Cobalah memberi tanda proses yang pidnya cocok dengan ID grup kami. Jika itu gagal
ESRCH
, itu berarti kita mungkin yatim piatu. - Coba baca non-pemblokiran satu byte dari
/dev/tty
. Jika itu gagalEIO
, itu berarti kita mungkin yatim piatu.
(Masalah kami pelacakan ini adalah https://github.com/fish-shell/fish-shell/issues/422 )
Terima kasih atas pemikiran anda!