Tuesday, July 3, 2012

UNIX Programming

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

ก็ดูว่า พอมีข้อยกเว้น อยู่บ้าง เรื่องก็คงคล้ายๆกับ ในชีวิตจริง ที่ว่า เราเกลียดขี้หน้าใครบางคนเสียเต็มประดา ครั้นจะไล่ไปให้ห่างๆ ก็เกรงใจคนฝากงาน ครั้นจะบอกให้ไปลงนรกเสีย ก็ดูว่าให้สงสาร ใจไม่แข็งพอ เพราะมันไม่รู้เรื่อง จนในที่สุดมาลงเอยที่ว่า

เออก็ นี่พ่อ พ่อไปขึ้นสวรรค์เสียเถอะน่ะพ่อน่ะ

อะไรประมาณนี้ พร้อมกับมอบหมายงานบางอย่างให้ไปทำบนสวรรค์ ว่ายังงั้น จะชั้นไหนก็ช่างเหอะน่า

ในเรื่องของ process ก็คงคล้ายๆกัน กล่าวคือ เมื่อเราสั่งให้วิ่ง process ใหม่ด้วยคำสั่ง execl แล้ว เกิดมีข้อผิดพลาดขึ้น เรื่องกลับไม่ได้จบ ณ ตรงนั้น มันย้อนกลับมาหาตัวผู้สั่งการเอง มามีเรื่องกันตรงนี้ ดั่งตัวโปรแกรมสั้นๆ ข้างล่างนี้

/*
 * exec-return.c
 */

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    execl("/usr/local/bin/heaven", "heaven", NULL);
    fprintf(stderr,"Some one stole 'heaven', heaven closed.\n");
}


ข้อผิดพลาด มันเกิดขึ้น เพราะหาสวรรค์ไม่เจอ อันเนื่องมาจาก เราไปกำหนด ตำแหน่งแห่งหน ของสวรรค์ไว้ผิดที่ ผิดทางนั่นเอง  ซึ่งจะยังผลให้ process ใหม่ที่วิ่งอยู่นี้ ไม่สามารถทำงานได้ จึ่งต้องกลับมายังผู้สั่งการ แล้วเจอคำสั่งให้พิมพ์ข้อความ "Some one stole 'heaven', heaven closed.\n" ออกทาง standard error แล้วจึงปิด case จบงานกัน ที่ main นั่นเอง

ลองคอมไพล์โปรแกรมข้างบนนั้นดูซิ น่ะ

% cc -o myjob exec-return.c

แล้วลองเรียกดูด้วยคำสั่งนี้

% ./myjob

อันนี้ ก็เป็น หนึ่ง ในข้อยกเว้น ที่เกิดขึ้น ข้อยกเว้นที่ว่า เมื่อสั่ง exec แล้ว มันจะทำงานไป และจบงานตรงนั้น ไม่มีกลับมายังตัวผู้สั่งอีก

นี้ ขอคั่นรายการ ก่อนจะนำเสนอเรื่องราวของ process ในตอน process control ซึ่งจะว่าไป น่าจะเป็นการ create เสียมากกว่า แต่ก็อย่างว่า วิชาการเรื่องนี้ คนไทย ไม่ได้สร้าง/ผลิตขึ้น เขาว่ามายังไง ก็ต้องว่าไปยังงั้น อย่างมากก็แค่ท้วงติงไป ซึ่งอาจจะได้ผล ไม่ได้ผล ก็แล้วแต่ว่า เจ้าของนั้น จะรับฟังหรือไม่ (หรืออีกที ก็ เจ้าของนั้น จะยังมีชีวิตอยู่หรือเปล่า)

ลป.  ลืมไปว่า ใน FreeBSD นั้นไม่มีแฟ้ม /usr/local/bin/heaven ครับ หาก UNIX รสชาติที่ท่านใช้นั้นมี heaven ดูให้ดีดีก็แล้วกัน ยังไงเสียก็ อ่าน man heanven, คู่มือสวรรค์, ให้ละเอียดน่ะครับ

No comments:


View My Stats