Tuesday, June 26, 2012

UNIX Programming


“Process”
ได้เคยเขียนเรื่องของ process ไว้บ้างแล้ว ใน blog นี้, fork, แต่ขอเริ่มใหม่อีกครั้ง ให้อยู่ในหัวข้อของ UNIX Programming ไปเลยด้วยกันนี้

หลักการทำงานของ UNIX เท่าที่คลุกคลีมาคือ หากมีของอยู่แล้ว ก็ใช้ของนั้นมาทำงานให้ ไม่ต้องสร้างของนั้นขึ้นมาใหม่อีก และเพราะเหตุนี้ ใน FreeBSD จึงเต็มไปด้วย tools เพื่อใช้งาน เพื่อให้แต่ละงาน ช่วยงานอื่นให้สำเร็จลุล่วงไปได้

โดยหลักอันนี้เอง ทำให้เรา เรียกโปรแกรมอื่น มาทำงานให้เราขณะที่เราก็กำลังวิ่ง process ของเราอยู่ ซึ่งก็คือสิ่งที่ได้เขียนไป และ ให้ลิงค์ไว้ข้างบนนั้น นั่นเอง

(๓.๑) “system” ฟังก์ชั่น
เราใช้บริการของฟังก์ชั่นใน system library ชื่อ system เรียกโปรแกรมระบบ ในตัวอย่างนี้คือโปรแกรมชื่อ date มาช่วยงานได้ ดังนี้

#include <stdlib.h>

main()
{
    system("date");
}

ซึ่งในชีวิตจริง คงไม่ใช่โปรแกรม date นี้หรอก เป็นแต่เพียงยกตัวอย่างมาให้เห็นว่า การเรียกใช้บริการของฟังก์ชั่นใน system library นั้นกระทำกันผ่านช่องทางไหน  อนึ่ง ท่านสามารถ เขียน คำสั่งที่จะส่งผ่านให้ฟังก์ชั่น system ผ่านทางฟังก์ชั่น sprintf ได้

แต่ถึงอย่างนั้น วิธีการนี้ก็ยังคงมีข้อจำกัดอยู่ ตรงที่ว่า buffer output นั้นเราต้อง flush เอาเอง

(๓.๒) “Process Creation – execl & execv”
จะเห็นว่า แม้ฟังก์ชั่น system จะอนุญาตให้เรา เรียกโปรแกรม จากระบบปฏิบัติการ มาทำงานให้เราได้  แต่บางครั้ง ยังรู้สึกอยู่ว่า เราน่าจะทำอะไร มากกว่านั้นได้ กับ process ที่จะวิ่งงานให้นี้

วิธีที่ง่ายที่สุด สำหรับงานนี้คือ สั่งให้โปรแกรมใหม่นั้น ทำงานไปเลย โดยไม่ต้องหวลกลับมายัง โปรแกรมหลัก ของเราอีก   โดยการใช้ execl ดังนี้

/*
 * execl routine
 */

#include <unistd.h>

int main(int argc, char *argv[])
{
    execl("/bin/date", "date", NULL);
}

execl จะทับหน่วยความจำของโปรแกรมเดิมหมดสิ้น ดังนั้น จึงไม่สามารถ ที่จะกลับมาหา สถานะเดิม ได้อีกแล้ว เมื่อ execl ได้ทำงานเสร็จสิ้นแล้ว จึงมีแต่ ทำงานแล้วตายไปเลย อยู่ที่ว่า
  • สุคติ ทำงานสำเร็จ exit status 0 หรือ 
  • ทุคติ ทำงานไม่สำเร็จ มีปัญหา exit status ไม่เป็น 0

อีกหนึ่ง routine ที่คล้ายๆกับ execl คือ execv ที่อนุญาตให้ท่าน สร้างองค์ประกอบต่างๆ ของคำสั่งที่จะเรียกใช้งานได้ โดยมีวิธีการเรียกใช้งาน ดังนี้

int execv(const char *pathname, const char *argv[]);

ทั้ง ๒ routine นี้ เมื่อจะเรียกใช้งาน ต้องรวมแฟ้ม unistd.h เอาไว้ด้วย   ขอให้ท่านอ่าน execl(3) ด้วย และสำหรับรายละเอียดอื่นๆ จากเอกสารอ้างอิง หมายเลข ๓ บทที่ ๘  หัวข้อ process control

No comments:


View My Stats