Monday, January 24, 2011

fork

ท่านจะ fork ไปทำไม ถ้าไม่ต้องการแยกงานออกเป็น ๒ หรือ หลาย process ?
นี่คือสิ่งที่เพียรบอกน้องที่ถามใน thaibsd.com ในกระทู้ เรื่องที่จะให้โปรแกรมทำงาน ๕ วินาที

พอดี เรื่องที่เขียนไว้ ที่เกี่ยวข้องกับ process นั้น ปนเปไว้ในนี้แหละ แต่หายาก เพราะเขียนไว้นานแล้ว ตอนหลังจึงทราบว่า เขียนในเรื่องของ Literate programming ในคราวต่อสัญญา เลยบอกไปใน บอร์ด 


ถ้าน้องที่ถามไว้ แวะเวียนมาดูอีกครั้ง ก็รบกวนไปดูโดยละเอียดได้ตรงเรื่องของ literate programming ในด้านซ้ายมือนั่นแหละ หรือจะ click ที่คำสำคัญด้านล่างในนี้ก็ได้ครับ

แล้วจะมาเติมเต็มให้อีกครั้งน่ะ ขอเตรียมตัวไปทำงานก่อนหละ วันจันทร์ รถติดมาก

มาต่อกันอีกนิด เน้าะ
ในเอกสารที่เขียนขึ้นนั้น fork() โปรแกรมตรงจุดที่เรียก gnuplot มาทำงานต่อ แล้ว parent รอจนกว่า child process จะจบงาน โดย main() นั้นคือ parent ดังนี้

    if ((fork()) == 0) { /* child process */
         if (interactive)
                  execlp("/usr/local/bin/gnuplot","/usr/local/bin/gnuplot",(char *)0);
         else

                  execlp("/usr/local/bin/gnuplot","/usr/local/bin/gnuplot","jotawski.cmd",(char *)0);
    } else { /* parent wait here */
         wait(&sflag);
    }

ส่วนในเรื่องของคำสั่ง execlp() และพวกเขานั้น ไปอ่านดูใน manual page ได้ สำหรับที่ มะไฟ เขียนนี้ ใช้การเรียกแบบ list path เอา คือมี arguments กี่ตัว ก็ list ออกมา และบอก path ไว้เลย

สำหรับ case ของน้อง peposo นั้น บอกว่าตั้งเวลา ๕ วินาฑี เวลานี้ เริ่มวัดจากตรงไหน  ถ้าเริ่มตรงส่วนของ child ก็ใส่ใน ส่วนของ pid==0 ไป ง่าย ไม่งั้น ลำบากมากมีแต่เทพฯจึงกำหนดได้ว่า เมื่อเริ่ม load มันกินเวลาไปกี่มากน้อยแล้ว เผลอๆ มันเกิน ๕ วิน่าฑีไปแล้วด้วยยย

No comments:


View My Stats