การเข้ารหัสด้วย fork และ exec ตามตัวอย่างใน c

Coding With Fork Exec Example C



ชื่อบทความของเรามีฟังก์ชันที่แตกต่างกันสองอย่างของภาษา C ที่เกิดขึ้นขณะเรียกใช้โปรแกรมใดๆ ในระบบของเรา น่าเสียดาย ไม่มีความเป็นไปได้ที่จะเกิดมากกว่าหนึ่งโปรแกรมในแต่ละครั้งใน C มีเพียงงานเดียวเท่านั้นที่สามารถเกิดขึ้นได้ในเวลาใดเวลาหนึ่ง ซึ่งหมายความว่าจะไม่อนุญาตให้โปรแกรมทำงานพร้อมกัน ทำให้คุณต้องรอให้กระบวนการหนึ่งเสร็จสิ้นเพื่อดำเนินการกับอีกกระบวนการหนึ่ง เพื่อหลีกเลี่ยงปัญหาการแก้ไขปัญหานี้ คุณอาจต้องพัฒนาโปรแกรมของคุณในทางที่ดี การเป็นนักพัฒนาที่ดี ลินุกซ์ฟอร์ก () ใช้เพื่อเอาชนะการรอคอยและเพื่อให้เกิดภาวะพร้อมกันในระบบของคุณ ช่วยในการทำซ้ำกระบวนการใหม่และสร้างกระบวนการใหม่โดยการเรียกกระบวนการที่ซ้ำกัน กระบวนการใหม่เป็นกระบวนการลูก และกระบวนการก่อนหน้านี้เรียกว่ากระบวนการหลัก

ในขณะที่ฟังก์ชัน exec () ใช้เพื่อเปลี่ยนโปรแกรมปัจจุบันที่มีอยู่ด้วยโปรแกรมใหม่ การแทนที่นี้ทำได้โดยการแก้ไขเนื้อหาของโปรแกรมหรือไฟล์ ดังนั้นความแตกต่างระหว่าง fork และ exec คือ fork สร้างกระบวนการใหม่จากกระบวนการที่มีอยู่ และ exec ถูกใช้เพื่อแทนที่โปรแกรมที่มีอยู่โดยการสร้างใหม่







ข้อกำหนดเบื้องต้น

ในการรันโปรแกรม c ใดๆ บนระบบ Linux ของคุณ เราจำเป็นต้องติดตั้งข้อกำหนดเบื้องต้นบางอย่างบนมัน ไปที่เทอร์มินัลโดยใช้วิธีทางลัด Ctrl+Alt+T ตอนนี้เขียนคำสั่งต่อไปนี้เพื่อติดตั้งหน้าคน



$sudoฉลาดติดตั้งmanpages-dev



มันจะติดตั้งหน้าที่เกี่ยวข้องทั้งหมด





ในการรันโปรแกรมบน Linux คุณต้องติดตั้งคอมไพเลอร์โค้ด ที่ใช้ในการคอมไพล์โค้ดและรันโค้ด เพื่อจุดประสงค์นี้ เราจะติดตั้งที่เก็บ GCC ในระบบของเรา

$sudoฉลาดติดตั้งGCC



การเข้ารหัสด้วย exec ใน c

เนื่องจากเราได้ติดตั้ง man page ใน Linux แล้ว เราจะใช้คำสั่งต่อไปนี้เพื่อดูคำอธิบายเกี่ยวกับ exec ไวยากรณ์ตัวอย่างหลักมีดังนี้:

ไวยากรณ์

ผู้บริหาร(ชื่อเส้นทาง/ไฟล์, argv);

ที่นี่เราใช้ส่วนหัว unistd.h เนื่องจากมีข้อมูลทั้งหมดเกี่ยวกับตระกูลของฟังก์ชัน exec

$ชาย ผู้บริหาร

ในภาพด้านบนนี้ คุณสามารถสังเกตประเภทของ exec ได้ เหล่านี้เป็นตระกูลของฟังก์ชัน exec แต่ละอันมีไว้สำหรับฟังก์ชั่นที่แตกต่างกันตามฐานเดียวกัน exec

ตัวอย่าง: ต่อไปเราจะอธิบายการทำงานของ exec ด้วยความช่วยเหลือจากตัวอย่าง เราจะใช้ฟังก์ชันหนึ่งของ exec เพื่อสาธิตการทำงานของมัน ซึ่งก็คือ execv อันดับแรก เราจะสร้างไฟล์สองไฟล์ที่มีนามสกุล .c หลังจากสร้างแล้ว เราจะเขียนโค้ดตามลำดับและดำเนินการเพื่อดูผลลัพธ์

พิจารณาชื่อไฟล์ sample4.c. กรุณาเปิดมันและใช้รหัสต่อไปนี้ ในรหัสนี้ เราได้ใช้ execv ในลักษณะเฉพาะที่อ้างถึงด้านล่าง

ผู้บริหาร(./sample4copy , args);

ส่วนแรกมีเส้นทางไดเรกทอรีใหม่และส่วนที่สองแสดงอาร์เรย์อาร์กิวเมนต์เป็นพารามิเตอร์ที่เราส่งผ่าน

Sample4.c

ก่อนอื่น เราได้พิมพ์ id ของกระบวนการปัจจุบัน ประการที่สอง เราได้สร้างอาร์เรย์อักขระที่มี NULL ในตอนท้ายสำหรับการยกเลิก ประการที่สาม เราได้เรียกฟังก์ชัน sample4copy

Sample4copy.c

เมื่อเราเรียกใช้ฟังก์ชัน exec () ภาพกระบวนการจะเปลี่ยนไป ด้านล่างภาพอ้างอิงด้านล่างแสดงรหัสของ sample4copy.c.

ที่นี่เราใช้เฉพาะคำสั่งพิมพ์เพื่อรับรหัสของกระบวนการปัจจุบัน

ผลลัพธ์ของรหัสที่เกี่ยวข้องสามารถรับได้โดยใช้คำสั่งต่อไปนี้

$ GCC–o ตัวอย่าง4 ตัวอย่าง4.c
$ GCC –o sample4copy sample4copy.c
$./ตัวอย่าง4

ดังที่เราได้อธิบายไว้ก่อนหน้านี้ คำ GCC ถูกใช้เพื่อคอมไพล์โค้ด และหลังจากคอมไพล์แล้ว โค้ดก็จะถูกดำเนินการสำเร็จ

ตามภาพ PID ของไฟล์ sample4.c จะแสดงก่อนตามที่ประกาศก่อนการเรียก exec จากนั้นหลังจากที่เรียกใช้ฟังก์ชัน exec() ทั้งคำสั่ง print ของไฟล์ sample4copy.c จะถูกดำเนินการโดยที่ getpid() ถูกใช้เพื่อรับ id ของกระบวนการ

การเข้ารหัสด้วยส้อมใน c

ฟังก์ชัน fork() สร้างกระบวนการลูกจากกระบวนการหลัก นอกจากนี้ยังมีส่วนหัวสองส่วน รวมถึงข้อมูลส้อมในนั้น

ไวยากรณ์:

Pid_t ส้อม(โมฆะ);

เราสามารถใช้ man page เพื่อช่วยในการใช้งาน

$ชายส้อม

ตัวอย่าง: พิจารณาตัวอย่างด้วยการสร้างไฟล์ sample3.c เราจะป้อนรหัสภายในไฟล์ ตามรหัส เราได้ตั้งค่าสถานะส้อมเป็นส้อม

Sample3.c

เราใช้คำสั่ง if-else เพื่อใช้เงื่อนไข มีการประกาศคำสั่งการพิมพ์อย่างง่ายไว้ที่นี่เพื่อช่วยในการทำความเข้าใจแนวคิด fork() Forkrank ถูกประกาศเป็น 0 ก่อนแล้วจึงตามด้วย -1 ด้วย fork() ขณะนี้มีสองกระบวนการที่ทำงานพร้อมกัน สามารถรับผลลัพธ์ได้โดยใช้รหัสเดียวกัน ตามที่ใช้ในตัวอย่างข้างต้นใน exec

$ GCC –o ตัวอย่าง3.c
$./ตัวอย่าง3

ผลลัพธ์แสดงว่าโปรเซสลูกถูกดำเนินการเร็วกว่าพาเรนต์เมื่อโปรเซสพาเรนต์กำลังรออยู่ ฟังก์ชัน wait บอกเป็นนัยว่าจะทำให้ฟังก์ชันหลักรอ ยกเว้นว่ากระบวนการย่อยตัวใดตัวหนึ่งถูกยกเลิก

ระบบ Fork และ Exec เรียกรวมกัน

ที่นี่เราจะนำไฟล์สองไฟล์ชื่อ sample1.c และ sample2.c ขั้นแรก เปิดไฟล์ sampl1.c และเขียนโค้ดที่ต่อท้ายภาพด้านล่าง เราใช้ fork() system-call ที่นี่ เมื่อโปรเซสลูกถูกสร้างขึ้น p จะถูกกำหนดด้วย 0 ในขณะที่ใช้การเรียกระบบ exec sample1.c จะถูกแทนที่ด้วย sample2.c

Sample1.c

Sample2.c

คล้ายกับตัวอย่างที่กล่าวถึงข้างต้น ไฟล์ sample2 จะมีคำสั่ง printf อยู่ในนั้น ใน sample1.c คำสั่งพิมพ์แรกจะถูกดำเนินการก่อน จากนั้นฟังก์ชัน fork จะถูกเรียก เมื่อ p== 0 จากนั้นดำเนินการส่วนย่อยและไฟล์ sample2.c จะถูกเรียกใช้ ผลลัพธ์จะมี GCC เพื่อคอมไพล์ทั้งสองไฟล์ ที่นี่ id parent sample1.c และ sample2.c id ต่างกันเพราะเป็นพาเรนต์และลูก

บทสรุป

ในบทความนี้ เราได้ใช้ทั้ง fork และ exec แยกกันเพื่อทำความเข้าใจการใช้งานและแนวคิดอย่างง่ายดาย ฉันหวังว่าบทช่วยสอนนี้มีเนื้อหาเพียงพอที่จะนำไปสู่การเข้าถึงในการยกระดับความรู้ของคุณ