(โพสต์ซ้ำในยูนิกซ์ตามคำแนะนำใน/programming/13718394/what-should-interactive-shells-do-in-orphaned-process-group )
คำถามสั้น ๆ คือเชลล์ควรทำอย่างไรถ้าอยู่ในกลุ่มกระบวนการที่ถูกโยงถึงที่ไม่มี tty อยู่? แต่ฉันแนะนำให้อ่านคำถามยาว ๆ เพราะมันสนุก
นี่คือวิธีที่สนุกและน่าตื่นเต้นในการเปลี่ยนแล็ปท็อปของคุณให้เป็นเครื่องทำพื้นที่พกพาโดยใช้เปลือกที่คุณชื่นชอบ (ยกเว้นว่าคุณเป็นหนึ่งในพวก tcsh weirdos):
#include <unistd.h>
int main(void) {
if (fork() == 0) {
execl("/bin/bash", "/bin/bash", NULL);
}
return 0;
}
ทำให้ bash ตรึง CPU ที่ 100% zsh และปลาทำแบบเดียวกันในขณะที่ ksh และ tcsh พึมพำอะไรบางอย่างเกี่ยวกับการควบคุมงานและจากนั้นก็กระดูกงูซึ่งดีกว่าเล็กน้อย แต่ไม่มาก โอ้และเป็นผู้กระทำความผิดที่ไม่เชื่อเรื่องพระเจ้าแพลตฟอร์ม: OS X และ Linux ได้รับผลกระทบทั้งคู่
คำอธิบายของฉัน (อาจผิด) เป็นดังนี้: เปลือกลูกตรวจพบว่าไม่ได้อยู่เบื้องหน้า: tcgetpgrp(0) != getpgrp()
. ดังนั้นจึงพยายามหยุดตัวเอง: killpg(getpgrp(), SIGTTIN)
. แต่กลุ่มกระบวนการของมันเป็นเด็กกำพร้าเนื่องจากผู้ปกครอง (โปรแกรม C) เป็นผู้นำและเสียชีวิตและSIGTTIN
ส่งไปยังกลุ่มกระบวนการที่ถูกกำพร้าเพียงแค่ตกหล่น (ไม่เช่นนั้นจะไม่สามารถเริ่มต้นได้อีก ดังนั้นเปลือกลูกจะไม่หยุดทำงาน แต่ก็ยังคงอยู่ในพื้นหลังดังนั้นมันจะทำอีกครั้งทันที ล้างและทำซ้ำ
คำถามของฉันคือเชลล์บรรทัดคำสั่งจะตรวจสอบสถานการณ์นี้ได้อย่างไรและสิ่งที่ถูกต้องสำหรับการทำคืออะไร ฉันมีวิธีแก้ปัญหาสองข้อไม่เหมาะอย่างยิ่ง:
- ลองส่งสัญญาณกระบวนการที่ pid ตรงกับ ID กลุ่มของเรา ถ้าสิ่งนั้นล้มเหลว
ESRCH
นั่นหมายความว่าเราอาจกำพร้า /dev/tty
ลองอ่านไม่ปิดกั้นของหนึ่งไบต์จาก ถ้าสิ่งนั้นล้มเหลวEIO
นั่นหมายความว่าเราอาจกำพร้า
(ปัญหาของเราติดตามนี่คือhttps://github.com/fish-shell/fish-shell/issues/422 )
ขอบคุณสำหรับความคิดของคุณ!