ท่านจะ 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 มันกินเวลาไปกี่มากน้อยแล้ว เผลอๆ มันเกิน ๕ วิน่าฑีไปแล้วด้วยยย
Showing posts with label programming. Show all posts
Showing posts with label programming. Show all posts
Monday, January 24, 2011
fork
คำสำคัญ:
child,
exec,
fork,
FreeBSD,
literate programming,
parent,
process,
programming
Thursday, May 6, 2010
FreeBSD: programming -->getopt

เพื่อนๆ หลายท่านคงเคยใช้งานโปรแกรม แบบที่ต้องกำหนด option ด้วย เช่น
% find -n -x pattern filename
% grep -v R-dep
% grep -v R-dep
ซึ่งโปรแกรมลักษณะนี้ อำนวยความสะดวกให้ผู้ใช้มาก ในแง่ที่ว่า สามารถเพิ่มคุณลักษณะวิเศษไปจากเดิมได้ นิดหน่อย โดยไม่ต้องสั่งโปรแกรมเดิมมาทำงานซ้ำ
n, x หรือ v ในตัวอย่างนั้น เรียกว่า option การกำหนด option ให้กับโปรแกรมที่เขียนขึ้น แม้จะทำได้เองโดยง่าย แต่ในโลกของ unix แล้ว การใช้บริการของ system functions นั้นเป็นสิ่งที่ ต้องทำ เพราะอย่างน้อย ก็ ลดภาระ ของผู้พัฒนาโปรแกรม และ ทำให้ ตัดความกังวล เรื่อง ความปลอดภัยของระบบไปได้มาก
ความปลอดภัย เป็นเรื่องที่ล้อเล่นไม่ได้ น่ะ และในยามที่เรามีกฏหมายเกี่ยวกับคอมพิวเตอร์มาใช้งานแล้วเช่นนี้ หากโปรแกรมที่เราเขียนขึ้น มีช่องโหว่ว ก็ลำบากมากอยู่ ถ้าใช้กันผ่าน network
ในโอกาสพิเศษเช่นนี้ จึงใคร่ขอนำเสนอเรื่องสั้นๆ ไม่ยาวนัก แต่พอให้เกิดปัญญา มาตกลงปรองดองกันได้ ระหว่าง การเขียน code ขึ้นมาเอง กับการใช้บริการของ system functions (ผ่าน library)
function ที่ว่านี้ เรียกว่า getopt(3) ซึ่งเมื่อเปิด manual page ใน section ที่ 3 ดูก็ทราบรายละเอียดได้ว่า
- ต้อง link กับ standard C library (-lc) ในตอน compile ตัวอย่างคือ
% cc -o programme programme.c -lc - function นี้กำหนด prototype ไว้แล้วใน unistd.h header files ทำให้เราต้องรวมบรรทัด
#include <unistd.h>
เข้าไปด้วย
ตัวอย่าง ที่เขียนขึ้นจริงๆกับ โปรแกรมเรื่องสั้นภาค ๒ ที่เพิ่งส่งไปเมื่อวันอังคารที่ผ่านมานี้ ขอตัดมาให้ดูแต่เพียงบางส่วนเท่านั้น คือ
@ |getopt(3)|, one of many functions from system services
@<Getoption@>=
sflag = 0;
interactive=0;
while ((ch = getopt(argc, argv, "is:d:")) != -1) { <----
switch (ch) {
case 'i':@/
interactive = 1;@/
break;@/
case 's':
if ((fp = fopen(optarg, "r")) == NULL) {
fprintf(stderr,"%s: %s: %s\n",programme, optarg, strerror(errno));
status = OPEN_FILE;
}
sflag = 1;
strcpy(filename,optarg); /* for later used */
break;
case 'd':
if ((fp = fopen(optarg, "r")) == NULL) {
fprintf(stderr,"%s: %s: %s\n",programme, optarg, strerror(errno));
status = OPEN_FILE;
  }
strcpy(filename,optarg); /* for later used */
break;
case '?':@/
default:@/
fprintf(stderr,"usage: %s -[[i]s|[i]d] data-filename\n%s\n", programme,
strerror(errno));
status = USAGE;
break;
}
}
โดยที่ตรงบรรทัด while นั่นแหละ พอเดาออกน่ะครับว่า options ที่ใช้คือ i,s,d อันนี้ไม่ได้หมายถึง index for sustainable development ของการพัฒนาอย่างยั่งยืน อะไรหรอกน่ะ แต่มันเผอิญมาตรงกัน เท่านั้นเอง @<Getoption@>=
sflag = 0;
interactive=0;
while ((ch = getopt(argc, argv, "is:d:")) != -1) { <----
switch (ch) {
case 'i':@/
interactive = 1;@/
break;@/
case 's':
if ((fp = fopen(optarg, "r")) == NULL) {
fprintf(stderr,"%s: %s: %s\n",programme, optarg, strerror(errno));
status = OPEN_FILE;
}
sflag = 1;
strcpy(filename,optarg); /* for later used */
break;
case 'd':
if ((fp = fopen(optarg, "r")) == NULL) {
fprintf(stderr,"%s: %s: %s\n",programme, optarg, strerror(errno));
status = OPEN_FILE;
  }
strcpy(filename,optarg); /* for later used */
break;
case '?':@/
default:@/
fprintf(stderr,"usage: %s -[[i]s|[i]d] data-filename\n%s\n", programme,
strerror(errno));
status = USAGE;
break;
}
}
กล่าวคือ option ของโปรแกรมที่ใช้งานจริงจริง เมื่อเรียกใช้ ก็จะอยู่ในรูป
% programme -i -sfilename | -dfilename
หรือ% programme -isfilename | -idfilename
หรือ% programme -sfilename | -dfilename
จาก manual page ทราบว่า เรามีภาระเพียงกำหนด argument ที่ 3 ให้กับ system function นี้ ซึ่ง มีรูปแบบ ที่แน่นอน ไว้ให้แล้ว พร้อมกับเขียน code มาเพื่อรองรับ option ที่กำหนดไว้ ก็เท่านั้นเองและในตัวอย่าง มะไฟ ก็เพียงเลือกเอาว่า จะใช้ option i,s,d โดยที่ ๒ อันหลังนั้นต้องมีชื่อแฟ้มตามมาด้วยเสมอ กล่าวคือ ต้องอยู่ในรูป
% programme -sfilename
หรือ% programme -dfilename
ย่างนี้เป็นต้นเสมอ จะใช้แต่ option ใด option หนึ่งโดดๆ ไม่มีชื่อแฟ้มตามมาด้วย ไม่ได้ใน manual page นั้น เขาบอกไว้ชัดเจนว่า option ที่มี argument ตามมานั้น ให้ตามหลัง option นั้นด้วย : เสมอ เพื่อแยกจาก option อื่นที่ไม่มี argument ตามมาด้วย ส่วนที่ว่า argument ที่ตามมาด้วยนั้น จะเขียนติดต่อกันไปเลย อย่างในตัวอย่างที่ยกมาให้ดู หรือ จะมี space ตามเพื่อความสวยงาม ก็ได้ ไม่ว่ากัน
ในตัวอย่างที่ยกมานั้น option s และ option d มี : ตามอยู่ด้วย ทำให้ทราบว่า ทั้ง ๒ option นั้นมี argument ตามมาแน่นอน ซึ่งก็คือชื่อของแฟ้มเอกสาร ที่จะเปิดเพื่ออ่านข้อมูลนั่นเอง
ก็หวังว่าคงพอเข้าใจบ้าง
และเมื่อลองเทียบ ความเรียบง่ายนี้ กับ codes ที่ต้องเขียนเองขึ้นมา โดยขอให้ไปดูจากหนังสือ The C Programming Language ในบทที่ ๕ section ที่ 10 Command-line Arguments ท่านก็จะพบว่า ยุ่งเหยิงมากกว่ากันเยอะเลย เอาแค่การตีความ precedence ของ pointers & operator ก็แทบจะพูดได้ว่า
โชคดีแล้ว ที่ไม่ต้องเขียนเอง
การใช้บริการของ system function ผ่าน library ทั้งหลายที่มีให้ จึงนับว่าดีที่สุด
ขอยกคุณงามความดีนี้ ถวายเป็นราชพลี ถวายเป็นปฏิบัติบูชา ในวาระ ฉัตรมงคลสมัย อันประเสริฐยิ่งนี้
อันใดที่บกพร่อง มะไฟ ฅนยาก ขอน้อมรับไว้แต่ผู้เดียว
อันใดที่บกพร่อง มะไฟ ฅนยาก ขอน้อมรับไว้แต่ผู้เดียว
Thursday, March 25, 2010
บุญฤทธิ์ อาศัยความเพียรเป็นไฟเผากิเลสให้เร่าร้อน (ภาค ๓)
ก็เพียงจะยืนยันว่า เมื่อท่านพยายามถึงที่สุดแล้ว สวรรค์ หรือ อะไร ก็ไม่สามารถห้าม หรือ รั้งท่านเอาไว้ได้ ตามคำสอนหลวงพ่อโตนั่นเอง
จากงานที่มอบหมาย ให้เขียนโปรแกรมการเคลื่นที่ ๑ มิติ แล้วแสดงผลด้วยกราฝิก
มันต้องจำลองว่า ระยะทางในแนวนอนของจอแสดงภาพ คือแกน x จะกี่เมตร ก็ค่อยมาว่ากันอีกที แล้วเรามาหาความเร็วเอา กำหนดเอา แล้วให้แสดงผลออกมา
สิ่งที่ต้องการคือ pixel per inch , graphics programming in X widow system
ค้นจาก google ได้อย่างมากก็เพียง bit per pixel แต่ ที่สุดก็เจอ
ค้นจาก เอกสารของเครื่องที่ลง FreeBSD ไว้ ก็เจอบ้าง vgagl, svgalib ก็เข้าใจเพิ่มขึ้น เสียดายแต่ออกไปทาง text
ค้นจาก FreeBSD Forums ก็เจอ และที่เป็นผลพวงจริงๆก็คือได้ references สำหรับการเขียนโปรแกรมแสดงผลเป็น graphics ที่ต้องการนั่นแหละ ที่ได้ไปถามไว้ ในวันถัดมา หลังจากได้คำตอบแรกแล้ว
ที่ได้ประโยชน์จริงๆ ก็ เนี่ยเลย ไปเลยหากสนใจเขียนโปรแกรมสนุกๆเล่นกันมั่ง
น่ะ อย่างอมือ งอเท้าเอาแต่รอสวรรค์ช่วย เราต้องช่วยตนเองก่อนอื่น เมื่อพยายามเต็มที่แล้ว สำเร็จ ก็ภาคภูมิใจ เป็นกำลังใจ ให้ทำงานด้วยความตั้งใจ ต่อไป หรือ แม้กระทั้งว่า ล้มเหลว ก็ ไม่มีใครตำหนิติเตียนอะไรหรอก กลับจะได้รับคำชมเชยด้วยซ้ำไปนา
จากงานที่มอบหมาย ให้เขียนโปรแกรมการเคลื่นที่ ๑ มิติ แล้วแสดงผลด้วยกราฝิก
มันต้องจำลองว่า ระยะทางในแนวนอนของจอแสดงภาพ คือแกน x จะกี่เมตร ก็ค่อยมาว่ากันอีกที แล้วเรามาหาความเร็วเอา กำหนดเอา แล้วให้แสดงผลออกมา
สิ่งที่ต้องการคือ pixel per inch , graphics programming in X widow system
ค้นจาก google ได้อย่างมากก็เพียง bit per pixel แต่ ที่สุดก็เจอ
ค้นจาก เอกสารของเครื่องที่ลง FreeBSD ไว้ ก็เจอบ้าง vgagl, svgalib ก็เข้าใจเพิ่มขึ้น เสียดายแต่ออกไปทาง text
ค้นจาก FreeBSD Forums ก็เจอ และที่เป็นผลพวงจริงๆก็คือได้ references สำหรับการเขียนโปรแกรมแสดงผลเป็น graphics ที่ต้องการนั่นแหละ ที่ได้ไปถามไว้ ในวันถัดมา หลังจากได้คำตอบแรกแล้ว
ที่ได้ประโยชน์จริงๆ ก็ เนี่ยเลย ไปเลยหากสนใจเขียนโปรแกรมสนุกๆเล่นกันมั่ง
น่ะ อย่างอมือ งอเท้าเอาแต่รอสวรรค์ช่วย เราต้องช่วยตนเองก่อนอื่น เมื่อพยายามเต็มที่แล้ว สำเร็จ ก็ภาคภูมิใจ เป็นกำลังใจ ให้ทำงานด้วยความตั้งใจ ต่อไป หรือ แม้กระทั้งว่า ล้มเหลว ก็ ไม่มีใครตำหนิติเตียนอะไรหรอก กลับจะได้รับคำชมเชยด้วยซ้ำไปนา
คำสำคัญ:
FreeBSD,
FreeBSD forum,
gtk tutorial,
programming,
x windows,
ไกลปืนเที่ยง
Subscribe to:
Posts (Atom)

