Note05 Swap file ของโปรแกรม vi (.ชื่อแฟ้ม.ส่วนขยาย.swp) -------------------------------------------- เมื่อผู้ใช้ป้อนคำสั่งที่เชลล์ สร้างจะสร้างโพรเซสของคำสั่งนั้น และปล่อยให้โพรเซสนั้นทำงาน เชลล์จะหยุดการทำงานลง ในช่วงระยะเวลานี้ผู้ใช้จะป้อนคำสั่งอื่นให้เชลล์ทำงานอีกไม่ได้ ต้องรอจนกว่าโพรเซสที่กำลังดำเนินการนั้นจะจบ โพรเซสที่กำลังทำงานอยู่นี้เรียกว่า foreground process ซึ่งโดยทั่วไปมีการทำงานอบบโต้ตอบกับผู้ใช้ (interactive -- มีการรับข้อมูลจากแป้นพิมพ์ และ/หรือ มีการแสดงผลทางจอภาพ) หรือกล่าวอีกนัยหนึ่งคือ เชลล์ต้องหยุดรอให้การทำงานของ foreground process เสร็จสิ้นลง ก่อนที่เชลล์จะทำงานต่อไป ซึ่งเป็นภาวะการทำงานตามปกติของหาร login ต่อหนึ่ง terminal ในทางตรงกันข้าม ผู้ใช้อาจกำหนดให้คำสั่งที่ป้อนมีการทำงานแบบ background เมื่อเชลล์สร้างโพรเซสและให้โพรเซสนั้นทำงานแล้ว เชลล์สามารถทำงานต่อไปได้ โดยไม่ต้องรอให้โพรเซสทำงานเสร็จเหมือนในกรณีของ foreground process background process ในระบบที่รู้จักกันดีได้แก่โพรเซสผู้ให้บริการต่างๆ เช่น โพรเซสให้บริการเข้าใช้เครื่องจากระยะไกล, โพรเซสให้บริการเอกสาร web, และ โพรเซสให้บริการถ่ายโอนแฟ้มข้อมูล เป็นต้น โพรเซสที่ทำหน้าที่ให้บริการนี้มีชื่อเรียกทั่วไปว่า server ส่วนโพรเซสที่ขอรับบริการเรียกว่า client ในระบบปฏิบัติการ Unix โพรเซสผู้ให้บริการมีชื่อเรียกเฉพาะว่า daemon เช่น crond - ให้บริการ run โปรแกรมแบบ background ในเวลาที่กำหนด httpd - web server daemon - ให้บริการเอกสาร web inetd - internet daemon - ให้บริการเชื่อมต่อกับเครือข่าย ผู้ใช้สามารถสั่งให้คำสั่งทำงานแบบ background ได้โดยเพิ่มเครื่องหมาย ampersand (&) ที่ท้ายคำสั่งนั้น เช่น $ myprogram & โปรแกรมที่ทำงานแบบ background เป็นโปรแกรมที่ไม่ควรมีการโต้ตอบกับผู้ใช้ เช่น อ่านข้อมูลจากแฟ้มที่กำหนดแทนที่จะอ่านจากแป้นพิมพ์ ส่งผลลัพธ์หรือข่าวสารต่างๆ เก็บในแฟ้ม แทนที่จะส่งออกทางจอภาพ หากไม่เป็นเช่นนี้อาจมีการรับข้อมูลหรือแสดงผลรบกวนการทำงานของโปรแกรมที่ทำงาน foreground ได้ ทั้งนี่เพราะโปรแกรมที่ทำงานแบบ background ยังคง "เกาะ" อยู่กับ terminal เดียวกับที่โปรแกรม foreground ใช้งาน เราสามารถหยุดพักการทำงานของโพรเซสชนิด forground โดยใช้แป้น Ctrl-Z (เปลี่ยนให้มีสถานะเป็น suspended) Ctrl-Z (26) -- SUB (substutute) ผู้ใช้กำลังใช้โปรแกรม vi แก้ไขแฟ้ม hello.c เมื่อเสร็จเรียบร้อย ต้องการจัดเก็บแฟ้มโดยการกดแป้น Shift-ZZ แต่แทนที่จะกดแป้น Shift กลับไปกดแป้น Ctrl แทน กลายเป็น Ctrl-Z ตามด้วย Z เชลล์จะหยุดการทำงานของโปรแกรมไว้ชั่วคราว พร้อมแสดงข่าวสาร [1]+ Stopped vi hello.c หมายความว่าเชลล์หยุดการทำงานของ "vi hello.c" โดย "งาน" (job) นี้เป็นงานหมายเลข 1 ในความดูแลของเชลล์ จากนั้นจะแสดงเครื่องหมาย prompt เพื่อรอรับคำสั่งต่อไป $ _ หากใช้คำสั่ง ls -al จะปรากฏผล เช่น $ ls -al -rw------- 1 jira staff 12288 Feb 6 14:06 .hello.c.swp นั้นคือเมื่อเชลล์หยุดการทำงานของ vi เชลล์จะทำการเก็บหน่วยความจำที่ vi ใช้ทำงานกับแฟ้ม hello.c ไว้ หรือเก็บ image ของโพรเซสของ vi ไว้ โดยเก็บเป็นแฟ้มซ่อน (ขึ้นต้นด้วยเครื่องหมายจุด) มีชื่อเดียวกับแฟ้มที่กำลังแก้ไข และกำหนดให้มีส่วนขยายเป็น .swp หมายถึงเป็น swap file (swap - แลกเปลี่ยนระหว่างหน่วยความจำหลักและแฟ้มในจานแม่เหล็ก) หลังจากจุดนี้ไป ผู้ใช้อาจดำเนินการได้หลายแบบ เช่น ๑. ที่ผู้ใช้ไม่ได้อ่านข่าวสาร และเข้าใจว่าจัดเก็บแฟ้มไปแล้ว ต้องการทำงานกับแฟ้มนี้อีกโดยใช้คำสั่ง $ vi hello.c โปรแกรม vi จะแสดงข่าวเตือนดังนี้ E325: ATTENTION Found a swap file by the name ".hello.c.swp" # พบแฟ้มชื่อ ".hello.c.swp" ... ... ... # รายละเอียดของแฟ้ม process ID: 5998 (still running) # โพรเซสหมายเลข 5998 (ยังทำงานอยู่) While opening file "hello.c" # เมื่อพยายามเปิดแฟ้ม "hello.cW ... ... ... (1) อาจเป็นไปได้ว่ามีโปรแกรมอื่นกำลังใช้งานแฟ้มนี้อยู่ ขอให้ดำเนินการต่อไปด้วยความระมัดระวัง เช่น เปิดเพื่ออ่านอย่างเดียว หรือ เลิกทำงาน (มิฉะนั้นแฟ้มจะเป็นไปตามที่โปรแกรมที่ save แฟ้มครั้งสุดท้าย) (2) โปรแกรม vi ค้างหรือหยุดทำงาน ผู้ใช้สามารถกู้แฟ้มที่ทำงานอยู่ครั้งสุดท้ายเพื่อทำงานต่อไปได้ Swap file ".hello.c.swp" already exists! [O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort: ผู้ใช้เลือกทำงานได้หลายอย่างคือ โดยเลือกกดแป้นตัวอักษรในวงเล็บ [O] เปิดเพื่ออ่านอย่างเดียว, (E) ไม่สนใจว่าต่อไปจะเป็นอย่างไร ขอแก้ไขแฟ้มต่อไป, (R) กู้แฟ้ม, (Q) เลิก, และ (A) ทางเลือก (ก). เลือก R (Recover) เพื่อกู้ข้อมูลที่แก้ไขค้างไว้ vi จะแสดงข้อความให้กดแป้น Enter หรือป้อนคำสั้ง Press ENTER or type command to continue ง่ายที่สุดคือกดแป้น Enter เมื่อแก้ไขและ Save แฟ้มแล้ว ต้องลบแฟ้ม ".hello.c.swp" เพื่อป้องกันไม่ให้ vi เตือนอีก (ข). เลือก Q (Quit) เพื่อเลิกการทำงานของ vi เฉพาะแฟ้มนี้ หรือ A (Abort) เพื่อเลิกการทำงานของ vi ทั้งหมดในกรณีที่มี การแก้ไขหลายแฟ้มพร้อมกัน และลบแฟ้ม ".hello.c.swp" เพื่อเริ่มต้นทำงานใหม่ Quit - quit current session, Abort - quit all sessions ๒. ในกรณีที่แน่ใจว่าหยุดการทำงานเพราะกดแป้น Ctrl-Z และต้องการทำงานต่อไป สามารถทำได้เนื่องจากโพรเซสยังคงอยู่ในระบบ เพียงแต่ถูก swap out ออกเป็นแฟ้มชั่วคราว โดยการกำหนดให้โพรเซสกลับมาทำงานแบบ foreground อีก $ jobs # ขอดูงานในความควบคุมของเชลล์ [1]+ Stopped vi hello.c # เพื่อดูหมายเลขงาน $ fg %1 # กำหนดให้งานหมายเลข 1 ทำงานแบบ foreground โปรแกรม vi จะทำงานต่อไปจากจุดที่หยุดไว้ เมื่อ save ระบบจะลบ swap file ให้โดยอัตโนมัติ หากสนใจรายละเอียดเพิ่มเติม อ่านได้จาก "คำถาม-คำตอบ" จาก vi.stackexchange.com โดยเฉพาะคำตอบที่ 3 vi and vim beta: What's the difference between "quit" and "abortW? https://vi.stackexchange.com/questions/3227/whats-the-difference-between-quit-and-abort หมายเหตุ ------- 1. คำสั่ง jobs, fg, และ bg เป็นคำสั่งของเชลล์ 2. การควบคุมการทำงานของโพรเซส, กด Ctrl-C (SIGTERM) เพื่อเลิกทำงาน, กด Ctrl-Z (SIGSTOP) เพื่อหยุดทำงาน แสดงเป็นแผนภาพสถานะของโพรเซสได้ดังนี้ ----------- / \ Ctrl-C --------> Ready Running ------------>Exit \ / \ / Ctrl-Z Suspended