การเรียกของระบบทำหน้าที่เป็นเกตเวย์หลักระหว่างโปรแกรมและเคอร์เนลระบบปฏิบัติการ Linux แม้ว่าคุณจะจำเป็นต้องมีการเรียกระบบตลอดอาชีพการเขียนโปรแกรม C ของคุณ ไม่ว่าคุณจะตั้งเป้าเพื่อประสิทธิภาพการทำงานที่ยอดเยี่ยมหรือคุณลักษณะบางอย่าง ที่เก็บ Glibc หรือไลบรารีมาตรฐานอื่นๆ ที่พบใน Linux distros ยอดนิยมก็เพียงพอสำหรับคนส่วนใหญ่ ความต้องการ. ในคู่มือนี้ เราจะสร้างแนวคิดเกี่ยวกับการเรียกระบบการเขียนในภาษาซี
ไวยากรณ์:
#รวมssize_tเขียน(int fd, const เป็นโมฆะ*บัฟ, size_t นับ);
ในไวยากรณ์ข้างต้นนี้ บรรทัดแรกแสดงไลบรารีสำหรับการเรียกระบบ ในบรรทัดที่สอง fd ย่อมาจาก file descriptor ซึ่งเป็นตัวเลขที่ระบุไฟล์ที่เปิดอยู่ของกระบวนการ คีย์เวิร์ด *buf ย่อมาจาก buffer ข้อมูลนี้มีข้อมูลอยู่ในนั้น ต่อไปคือการนับ เป็นจำนวนไบต์ที่จะเขียนไปยัง file descriptor จากบัฟเฟอร์
ติดตั้งข้อกำหนดเบื้องต้น:
ในการรันโค้ดภาษา C คุณต้องติดตั้งแพ็คเกจบางตัวในการแจกจ่าย Linux ก่อน หากคุณต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับการเรียกระบบการเขียน คุณต้องติดตั้งแพ็คเกจ manpages-dev เพื่อดำเนินการดังกล่าว ในการเปิดเทอร์มินัลโดยใช้ปุ่มลัด Ctrl+Alt+T หลังจากเปิดแล้ว ให้เขียนคำสั่ง apt install ด้านล่างตามด้วยคีย์เวิร์ด manpages-dev เพื่อติดตั้ง manpages
$sudoฉลาดติดตั้งmanpages-dev
จะใช้เวลาสักครู่ในการติดตั้ง manpages รอให้เสร็จสิ้น
หลังการติดตั้ง คุณสามารถดูข้อมูลเพิ่มเติมเกี่ยวกับการเรียกระบบการเขียนผ่านคำสั่ง man ด้านล่างในเชลล์
$ชาย 2 เขียน
หน้าคนส่งออกสำหรับคำสั่งเขียนได้รับด้านล่าง คุณสามารถอ่านข้อมูลเกี่ยวกับมัน กด q เพื่อออกจากคู่มือ
ตอนนี้ได้เวลาติดตั้งแพ็คเกจ Gcc ในระบบ Linux เพื่อให้ทำงานในภาษา C ในการนั้น ให้เปิดเชลล์และเขียนคำสั่ง apt install ด้านล่างตามด้วยคีย์เวิร์ด gcc
$sudoฉลาดติดตั้ง gcc
ในระหว่างการติดตั้ง ระบบอาจขอให้คุณยืนยันการดำเนินการติดตั้งนี้โดยกด y เพื่อดำเนินการต่อและ n เพื่อหยุดการทำงาน ดังนั้นให้แตะปุ่ม y แล้วกดปุ่ม Enter
มันจะถูกติดตั้งในระบบของคุณภายในไม่กี่นาที และบรรทัดสุดท้ายของผลลัพธ์จะเป็นดังแสดงในภาพรวมด้านล่าง
ตัวอย่าง:
มาดูตัวอย่างการเรียกระบบการเขียนในการแจกจ่าย Linux ของเรากัน ดังนั้นให้เปิดเชลล์บรรทัดคำสั่งและสร้างไฟล์ C ใหม่ในนั้นด้วยนามสกุล dot c คุณต้องใช้คำสั่งนาโนด้านล่างเพื่อสร้างและเปิดอย่างรวดเร็ว เราได้ตั้งชื่อมันว่า new.c.
$นาโนnew.c
หน้าต่างด้านล่างจะเปิดขึ้น ตอนนี้คุณต้องเขียนโค้ดที่แนบมาในไฟล์นี้ ในรหัสนี้ เราได้รวมไลบรารี unistd.h ไว้ก่อนแล้ว จากนั้นเราได้สร้างฟังก์ชันหลัก และภายในฟังก์ชันนี้ เราได้สร้างการเรียกระบบการเขียน ในการเรียกระบบนี้ พารามิเตอร์แรกสุดคือ file descriptor ในกรณีนี้ จำนวนเต็ม 1 แสดงถึงหน้าจออุปกรณ์ส่งออก และได้รับการแก้ไข ดังนั้นผลลัพธ์ของเราจะแสดงบนหน้าจอ พารามิเตอร์ที่สองแสดงข้อมูลบัฟเฟอร์ คุณสามารถเพิ่มอะไรก็ได้ และพารามิเตอร์สุดท้ายแสดงจำนวนนับสำหรับข้อมูลที่กำหนดในพารามิเตอร์บัฟเฟอร์ ตามที่เราได้กล่าวถึง 5 เป็นจำนวนนับ มันจะแสดงเฉพาะ 5 ไบต์แรกของข้อมูลบัฟเฟอร์และละเว้นไบต์ที่เหลือ บันทึกรหัสนี้โดยใช้ปุ่มลัด Ctrl+S และออกจากไฟล์นี้โดยใช้คำสั่ง Ctrl+X
#รวมInt หลัก()
{เขียน(1อักษะ สินธุ์5);}
ในเทอร์มินัล ให้ลองใช้คำสั่ง gcc ด้านล่างเพื่อคอมไพล์โค้ดที่สร้างขึ้นใหม่นี้ด้วยชื่อไฟล์
$gccnew.c
ลองตรวจสอบรหัสนี้โดยใช้ไฟล์ a.out เริ่มต้นที่สร้างขึ้นในขณะใช้งาน ลองใช้คำสั่ง a.out ด้านล่างเพื่อตรวจสอบผลลัพธ์ของการเรียกระบบการเขียน เราต้องใช้ร่วมกับ ./ เพื่อเลือกไฟล์จากไดเร็กทอรีปัจจุบัน
$./ก.ออกผลลัพธ์ที่คุณเห็นได้แสดงเฉพาะคำว่า Aqsa เนื่องจากจำนวนนับ 5
มาเปลี่ยนรหัสของเรากันสักหน่อย เราได้เปลี่ยนจำนวนการนับเป็น 11 เนื่องจากเรามีข้อมูลบัฟเฟอร์ทั้งหมด 11 ไบต์ Aqsa Yasin ดังนั้นคราวนี้ ผลลัพธ์จะแสดงไบต์ทั้งหมดของข้อมูลสตริง Aqsa Yasin บันทึกไฟล์นี้โดยใช้ Ctrl+S และออกโดยใช้ปุ่มลัด Ctrl+X
มาคอมไพล์โค้ดที่อัปเดตโดยใช้คอมไพเลอร์ gcc ที่เพิ่งติดตั้งใหม่สำหรับการแจกจ่าย Linux ลองใช้คำสั่ง gcc เดียวกันกับชื่อไฟล์ new.c
$gccnew.c
ตอนนี้แสดงผลลัพธ์ของรหัสเดียวกันโดยใช้คำสั่ง a.out ก่อนหน้าดังต่อไปนี้ ผลลัพธ์แสดงสตริงเต็ม Aqsa Yasin ของบัฟเฟอร์
$./ก.ออก
มาดูกันว่าโค้ดทำงานอย่างไรเมื่อเรานับจำนวนที่มากกว่าจำนวนไบต์ทั้งหมดที่ข้อมูลบัฟเฟอร์มีอยู่ เราเลยใช้การนับเป็น 30 บันทึกและปิดไฟล์
รวบรวมไฟล์ที่อัปเดตเดียวกันโดยใช้คำสั่ง gcc ดังต่อไปนี้
$gccnew.c
ตอนนี้รันไฟล์โดยใช้คำสั่ง a.out และเอาต์พุตจะแสดงข้อมูลบัฟเฟอร์รวมถึงค่าขยะบางส่วนตามที่แสดงในเอาต์พุตสแน็ปช็อตด้านล่าง$ ./a.out
คุณยังสามารถตรวจสอบจำนวนไบต์ทั้งหมดที่เขียนลงในไฟล์ได้โดยใช้โค้ดด้านล่างในไฟล์เดียวกัน
รวบรวมรหัสโดยคำสั่ง gcc
$gccnew.c
เอาต์พุตแสดงจำนวนไบต์ทั้งหมด รวมถึงข้อมูลบัฟเฟอร์และตัวแบ่งบรรทัด โดยใช้คำสั่ง a.out
$./ก.ออก
บทสรุป:
ในบทช่วยสอนนี้ เราได้อธิบายแนวคิดในการใช้การเรียกระบบการเขียนใน C อย่างละเอียด ลองตัวอย่างทั้งหมดเพื่อทำความเข้าใจแนวคิดของการเรียกระบบการเขียนโดยใช้บทความนี้