Monday, June 18, 2012

UNIX Programming


อันธรรมดาเครื่องคอมพิวเตอร์ หรือที่สมัยนี้เรียกกันเป็น Desktop มั่ง Notebook มั่ง Netbook มั่ง Tablet มั่ง หากปราศจากเสียซึ่ง softwares ซะแล้ว ก็ไม่ต่างอะไรกับเศษวัสดุธรรมดาๆนี่เอง ประโยชน์ แม้แต่จะใช้ขับไล่หมา แมว ปัดกวาดบ้าน ก็ยังแทบหาไม่ได้ อย่าว่าแต่การใช้งานตามวัตถุประสงค์เลย  อันว่า วัตถุประสงค์นี้ ก็ใช่แต่หมายถึงสิ่งที่ชายที่มีชื่อว่า ประสงค์ มีอยู่แต่เท่านั้นก็หามิได้ หากแต่ยังหมายความ ตามที่เขียนเอาไว้ใน พจนานุกรมภาษาไทย ฉบับราชบัณฑิตยสถาน พ.ศ. ๒๕๔๒ ซึ่งให้ความหมายเอาไว้ว่า

วัตถุประสงค์     น. ผลที่ประสงค์ให้บรรลุ เช่น วัตถุประสงค์ของ
    มัธยมศึกษาก็เพื่อให้เยาวชนมีความรู้ คิดเป็น ทำเป็น และมีคุณธรรม,
    จุดประสงค์ ก็ว่า.

ที่แม้จะพยายามอ่านอย่างไรๆ ก็ยากที่จะทำความเข้าใจได้ ภายในระยะเวลาทีกำหนด

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

แต่แม้อย่างนั้น พึงทราบว่า วัตถุประสงค์นั้น ย่อมแตกต่างกันไป มีบ้าง นำมาใช้แทนเครื่องพิมพ์ดีด มีบ้าง นำมาใช้แทนโทรทัศน์ มีอยู่มาก ที่นำมาแทน โรงภาพยนต์ที่ฉายเรื่องสั้นลามก คันหู ไม่เสบย  ก็พึงทราบไว้ด้วยเช่นกัน

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

กล่าวสั้นๆ เครื่องคอมพิวเตอร์นั้น เอามาใช้เขียน softwares หรือ programmes เท่านั้น จึงจะเกิดประโยชน์มหาศาล

ย้อนกลับเข้าสู่เรื่องเดิม UNIX Programming ที่ตั้งใจจะเขียนขึ้นมานี้ ก็เพียง ให้ท่านทั้งหลาย ได้ใช้ประโยชน์ เครื่องคอมพิวเตอร์ ที่ท่านหาซื้อมา ด้วยเงินของท่านนั้น ให้เกิดประโยชน์เต็มที่ โดยตั้งกรอบเรื่องราวเอาไว้ว่า
    ๑) เป็นการเขียนโปรแกรมภายใต้ระบบปฏิบัติการ FreeBSD อันเป็นการมุ่งหมายถึง สภาพแวดล้อมการทำงาน ในแบบฉบับของ UNIX เท่านั้น
    ๒) ผู้ใช้งานต้องมีความรู้เรื่องภาษา C เป็นอย่างดี
    ๓) เป็นการแนะนำแต่เรื่องพื้นๆ เป็นเบื้องต้นเท่านั้น

อนึ่ง เรื่องนี้ตั้งใจเขียนขึ้นมาด้วยความมุ่งมั่นดังกล่าว (ส่วนจะสำเร็จตามวัตถุประสงค์หรือไม่นั้น คงต้องไปนครนายกที่พี่สงค์เขาอาศัยอยู่ แล้วถามพี่เขาดู) ด้วยเอกสารอ้างอิงเท่าที่มีอยู่ในมือดังนี้
๑) 4.4 Programmer's Supplementary Documents;  CSRG University of California at Berkeley
๒) The C Programming Language; Brian W. Kernighan, Dennis M. Ritchie
๓) Advanced Programming in the UNIX Environment; W. Richard Stevens
๔) เล่มอื่นๆ อันจะยกมากล่าวเป็นครั้งคราวๆไป โดยเฉพาะอย่างยิ่ง FreeBSD documentations ที่ระบบปฏิบัติการให้มาทั้งหมด


(๑) พื้นฐาน

(๑.๑) โปรแกรม อาร์กิวเม้นต์
เมื่อโปรแกรมถูกเรียกใช้งานนั้น (บทที่ ๗) arguments ที่ระบุในคำสั่ง -- ที่ปรากฏในรูปแบบของ ชื่อแฟ้มเอกสาร ที่มักเรียกกันว่า โปรแกรม -- จะปรากฏในรูปแบบของ จำนวน arguments และ array ของตัวชี้ไปยัง arguments นั้นๆ ในฟังก์ชั่นที่ชื่อ main  แลโดยธรรมเนียมนิยม ค่าของ argv[0] จะเป็นชื่อของคำสั่งนั้นๆ ดังนี้แล้ว ค่าของ argc จึงมากกว่า 0 เสมอ

โปรแกรมต่อไปนี้ ซึ่งเป็นการยกตัวอย่างของโปรกม echo ในระบบมาอย่างหยาบๆ แสดงให้เห็นถึงกลไกดังกล่าวนั้น

/*
 *
 * myecho.c
 *
 */

#include <stdio.h>

int main(argc, argv)
int argc;
char *argv[];
{
  int i;

  for(i = 1; i < argc; i++)
    printf("%s%c", argv[i], (i < argc-1 ? ' ' : '\n'));

  return(0);
}


argv เป็นตัวชี้ไปยัง array ซึ่งมีตัวชี้แต่ละตัวชี้ไปยัง แถวของอักขระที่จบลงด้วย \0 อันทำให้ทึกทักเอาว่าเป็น strings ได้โดยง่าย   โปรแกรมนี้เริ่มด้วยการพิมพ์ argv[1] แล้วก็วนไปเรื่อยจนกว่าจะหมด

จำนวนนับของ arguments และตัว arguments เองจะเป็นพารามิเตอร์ให้กับฟังก์ชั่น main ที่ซึ่ง ถ้าเราต้องการใช้งานในภายหลัง เราต้อง copy เอาไว้ต่างหากในตัวแปรภายนอก อีกทีหนึ่ง

ในการคอมไพล์โปรแกรมนั้น เป็นกระบวนการที่ยุ่งยากเอาการอยู่ เพราะต้องกำหนดค่าของ search path ไปให้ครบ รวมทั้งการต้องระบุ libraries ต่างๆไปด้วย    ในการนี้ FreeBSD เขาเอื้อให้ผู้เขียนโปรแกรม สามารถคอมไพล์ง่ายๆ ผ่านคำสั่ง make โดยคำสั่งนี้จะมุ่งมองหาแฟ้มที่ชื่อ Makefile ในสาระบบแฟ้มปัจจุบันก่อนเป็นเบื้องต้น ก็แลสาระของแฟ้ม Makefile นั้นเป็นดังนี้,  สมมุติว่า โปรแกรมที่เขียนขึ้นมานี้ เก็บไว้ในแฟ้มชื่อ myecho.c และ ท่านต้องการให้ได้ผลลัพธ์ ของคำสั่ง จากการคอมไพล์แฟ้มนี้ ในชื่อ echo

CC=clang
CFLAGS= -g
PROG= echo
SRCS= myecho.c

NO_MAN=

.include <bsd.prog.mk>


ตรงบรรทัดที่ ๓ และ บรรทัดที่ ๔ จะเป็นการกำหนดชื่อโปรแกรม และ ชื่อแฟ้ม ตามลำดับ  บรรทัดอื่นๆ ขอให้ผ่านไปก่อน ยังไม่ต้องให้ความสนใจในตอนนี้  ท่านลำบากเพียงสั่ง

% make

ก็ได้ executable file ชื่อ echo ในสาระบบแฟ้มปัจจุบันมาทันที ทดลองเรียกดู ตามนี้

% ./echo This is my first C programmes in FreeBSD

แล้วสังเกตุดูผลลัพธ์ที่ได้ และ เมื่อท่านเรียกโปรแกรมของระบบ ด้วย argument เดียวกัน ให้สังเกตุผลลัพธ์ด้วยว่า ต่าง หรือ เหมือนกันอย่างไร

% echo This is my first C programmes in FreeBSD

ขอให้สังเกตุความแตกต่างของทั้ง ๒ คำสั่งที่ยกมาให้ดูนั้นด้วย อนึ่งระบบปฏิบัติการที่ใช้ขณะนี้คือ

FreeBSD mni.jes.in.th 9.0-STABLE FreeBSD 9.0-STABLE #16: Wed Jun 13 06:36:32 ICT 2012     root@mni.jes.in.th:/kaitag/obj/usr/src/sys/JOTAWSKI  amd64

ขอยุติตอนแรก ไว้ก่อนเท่านี้   ไม่นานเกินรอ ตอนถัดไปจะมาให้ท่านได้อ่านกัน

No comments:


View My Stats