วิธีการใช้เขียนการเรียกระบบในC

How Use Write System Call C



การเรียกของระบบทำหน้าที่เป็นเกตเวย์หลักระหว่างโปรแกรมและเคอร์เนลระบบปฏิบัติการ 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 อย่างละเอียด ลองตัวอย่างทั้งหมดเพื่อทำความเข้าใจแนวคิดของการเรียกระบบการเขียนโดยใช้บทความนี้