ทำไมบางโปรแกรมกลับสู่เชลล์ทันทีขณะที่บางโปรแกรมไม่ทำจนกว่าการประมวลผลจะเสร็จสมบูรณ์?


13

ฉันได้อ่านจากหนังสือระบบปฏิบัติการสมัยใหม่ว่าเมื่อคำสั่งถูกเรียกใช้เชลล์จะสร้างกระบวนการลูกรอจนกระทั่งลูกประมวลผลเสร็จสิ้นแล้วจึงรอคำสั่งอื่นจากผู้ใช้ geditแท้จริงนี่คือกรณีที่หลายโปรแกรมเช่น geditขั้วไม่ได้ใช้คำสั่งจนกว่าฉันจะได้ปิด อย่างไรก็ตามเมื่อฉันเปิดตัวแก้ไขรหัสatomเชลล์จะคืนค่าทันทีพร้อมที่จะยอมรับคำสั่งถัดไปแม้จะมีตัวแก้ไขที่ทำงานอยู่ การปิดเทอร์มินัลไม่ได้ปิดอะตอม นี่หมายความว่าตัวแก้ไขเปิดไม่เป็นกระบวนการลูกหรือไม่? กลไกพื้นฐานที่ทำให้สิ่งนี้เป็นไปได้คืออะไร?

วิ่งps au | grep atomให้

<username>      8042  0.0  0.0  15944  2264 pts/1    S+   00:55   0:00 grep --color=auto atom

1
หลังจากเริ่มตัวแก้ไข atom คุณสามารถเรียกใช้ps au | grep atomในเทอร์มินัลและเพิ่มผลลัพธ์ให้กับคำถามของคุณได้หรือไม่?
kirill-a

@ kirill-a ฉันได้อัปเดตคำถามแล้ว
Aswin PJ

คำตอบ:


18

คำถามถามเกี่ยวกับโปรแกรมสองประเภท:

  1. โปรแกรมที่โต้ตอบกับผู้ใช้ในเชลล์และ
  2. โปรแกรมที่ไม่โต้ตอบกับผู้ใช้ในเชลล์

ในกรณีแรกโปรแกรมที่โต้ตอบกับผู้ใช้ในเชลล์ได้รับการออกแบบให้ทำงานให้เสร็จก่อนที่จะส่งการควบคุมกลับไปที่เชลล์ ไม่มีอะไรพิเศษที่ทำ

กรณีที่สองซับซ้อนกว่า โดยปกติแล้วโปรแกรมจะแยก (ทำสำเนาของตัวเองในหน่วยความจำ) และจัดการเพื่อลบการเชื่อมโยงกับเทอร์มินัลการควบคุมของเชลล์และอาจดำเนินการโปรแกรมอื่น - ซึ่งทำงานโดยอิสระจากเชลล์ดั้งเดิม คุณอาจเห็นข้อความจากโปรแกรมที่สอง แต่โดยปกติจะไม่โต้ตอบกับคุณ คุณอาจมีวิธีใช้

  • กระบวนการdaemon (เซิร์ฟเวอร์) หรือ
  • โปรแกรมอาจทำงานในหน้าต่างใหม่ บรรณาธิการกราฟิกทำหลัง

อ่านเพิ่มเติม:


ส่วนเกี่ยวกับการฟอร์กและการยกเลิกการเชื่อมโยงจากเทอร์มินัลมักจะทำโดยการเรียกdaemonฟังก์ชั่นห้องสมุดที่ทำทั้งหมดนี้
kasperd

เพื่อหลีกเลี่ยงการรับเทอร์มินัลการควบคุมจะใช้ double fork แทน
jfs

สำหรับความคิดเห็นทั้งสอง: ฟังก์ชั่นนี้ไม่ได้อยู่ใน POSIX และฉันทราบถึงการควบคุมเครื่อง แต่ก็ให้คำตอบสั้นและง่าย ฉันใช้ double-fork มาตั้งแต่ปลายทศวรรษ 1980
Thomas Dickey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.