สัปดาห์ที่แล้วพี่บอกว่าโปรแกรมที่เขียนไปมีบั๊ก ให้หาให้หน่อยว่าเกิดจากอะไร การทำงานของมันก็ง่ายคือ โปรแกรมแรกรับคำสั่งจากผู้ใช้มาดูว่าจะเรียก โปรแกรมอื่นอย่างไร จากนั้นก็เลือกโปรแกรมมาทำงาน ถ้าใช้งานตามปกติสั่งคำสั่งเสร็จแล้วกดออก มันก็ไม่มีอะไรผิดปกติ แต่อาการผิดปกติจะเกิดขึ้น เมื่อสั่งเสร็จแล้วกดปิด terminal ทิ้งทันที
ดูตอนแรกก็คิดไปถึงเรื่อง process ของลินุกซ์ว่าต้องเป็นเรื่อง process แม่เรียก process ลูกแน่ๆ แต่ขุดไปขุดมาดันไม่เกี่ยวซะงั้นแต่เกิดจากตัวที่ คาดไม่ถึงคือ signal แถมเป็น signal ที่ไม่คิดว่าจะเจอด้วยคือ hang up (คือไม่เคยเจอมาก่อนหนะ ) เป็น signal ที่เกิดเมื่อมีการปิด terminal ไป(เหมือนกับวางหูโทรศัพท์อะไรประมาณนั้นมั้ง ไม่งั้นจะชื่อ hang up หรอ) หรือ connection หลุดจาก server ที่เราต่ออยู่ วิธีแก้ก็ง่ายแสนง่าย แทนที่โปรแกรม แรกจะเรียกโปรแกรมสองตามปกติ ก็เติมคำสั่ง nohup ไปข้างหน้าซะ signal นี้ก็จะไม่มากวนอีกต่อไป หรือ จะเขียนโปรแกรมที่สอง ให้ดัก signal นี้ก็ได้นะ แต่โปรแกรมที่เรียกขึ้นมาคิดว่าส่วนใหญ่คงแตะต้องโค้ดไม่ได้
ตัวอย่างๆ
File: invoker.c
#include
int main() {
system("runner");
while(1);
}
จากโค้ดด้านบนพอรันโปรแกรมนี้เสร็จมันจะไปเรียกอีกโปรแกรมนึงชื่อว่า runner โดย runner จะทำงานอยู่อีก process นึงแบบเงียบๆ ไป ถ้าเกิดเรากด ctrl-c หรืออะไร ทำยังไงก็ได้ให้โปรแกรมแรกปิด โดยที่เราไม่ปิด terminal โปรแกรมที่สองก็จะทำงานอยู่ได้โดยไม่มีปัญหาอะไร (ctrl-c แม้จะเกิด signal แต่เกิดขึ้นกับ process แรกไม่ไปยัง process สอง – แต่ยังไม่ได้ลองนะ ถ้าผิดก็ท้วงมาอีกที แนะนำให้ลองก่อน) แต่ถ้าหากขณะที่โปรแกรมเรารันอยู่แล้วกดปิด terminal เลย โปรแกรมที่สองจะได้รับ signal nohup ด้วยทันที ก็เลยแก้โค้ดเป็นด้านล่าง
system("nohup runner");
ส่วนจะใส่ & หรือไม่ & ก็ได้เพราะยังไงพอ process แรกตาย process สองจะเปลี่ยน parent เป็น init เอง