Exec System Call ใน C

Exec System Call C



ตระกูล exec มีฟังก์ชันมากมายใน C โดยพื้นฐานแล้วฟังก์ชัน C เหล่านี้ใช้เพื่อเรียกใช้คำสั่งระบบในกระบวนการแยกต่างหากที่โปรแกรมหลักและพิมพ์ผลลัพธ์

ในบทความนี้ ฉันจะพูดถึงตระกูลของฟังก์ชัน exec และแสดงวิธีใช้ฟังก์ชัน exec family แต่ละฟังก์ชันใน C มาเริ่มกันเลย







ฟังก์ชั่นระบบ C ในตระกูล Exec:

ตระกูลฟังก์ชัน exec ถูกกำหนดในส่วนหัว unistd.h . ดังนั้น คุณต้องใช้ส่วนหัวนี้ในโปรแกรม C ที่คุณต้องการใช้ฟังก์ชันเหล่านี้



ฟังก์ชัน exec ที่พร้อมใช้งานพร้อมกับพารามิเตอร์ของฟังก์ชันแสดงไว้ด้านล่าง:



  • int execl (const char *path, const char *arg, …, NULL);
  • int execlp (const char *file, const char *arg, …, NULL );
  • int execv (const char *path, char *const argv[]);
  • int execvp (const char *file, char *const argv[]);
  • int execle (const char *path, const char *arg, …, NULL, char * const envp[] );
  • int execve (const char *file, char *const argv[], ถ่าน *const envp[]);

มาดูกันว่าแต่ละฟังก์ชั่นเหล่านี้ทำอะไรได้บ้างและใช้งานอย่างไร





excl() ฟังก์ชั่นระบบ:

ในฟังก์ชันระบบ execl() ใช้เส้นทางของไฟล์ไบนารีที่เรียกใช้งานได้ (เช่น / bin / ls ) เป็นอาร์กิวเมนต์แรกและตัวที่สอง จากนั้น อาร์กิวเมนต์ (เช่น -lh , /บ้าน ) ที่คุณต้องการส่งต่อไปยังไฟล์ปฏิบัติการตามด้วย โมฆะ . จากนั้นฟังก์ชันระบบ execl() จะรันคำสั่งและพิมพ์ผลลัพธ์ หากมีข้อผิดพลาดเกิดขึ้น excl() จะส่งกลับ -1 มิฉะนั้นจะไม่ส่งคืนอะไรเลย

ไวยากรณ์:

intผู้บริหาร(const char *เส้นทาง, const char *โกรธ,...,โมฆะ);

ตัวอย่างของฟังก์ชันระบบ excl() ได้รับด้านล่าง:



#รวม

intหลัก(โมฆะ) {
char *binaryPath= '/ bin / ls';
char *arg1= '-ล';
char *arg2= '/บ้าน';

ผู้บริหาร(binaryPath,binaryPath,arg1,arg2,โมฆะ);

กลับ 0;
}

ฉันวิ่ง ls -lh / home คำสั่งโดยใช้ฟังก์ชันระบบ excl() อย่างที่คุณเห็น ผลลัพธ์ที่ถูกต้องจะปรากฏขึ้น

execlp() ฟังก์ชั่นระบบ:

excl() ไม่ได้ใช้ the เส้นทาง ตัวแปรสภาพแวดล้อม ดังนั้น ต้องใช้พาธแบบเต็มของไฟล์เรียกทำงานเพื่อเรียกใช้ด้วย execl() execlp() ใช้ตัวแปรสภาพแวดล้อม PATH ดังนั้น หากไฟล์ปฏิบัติการหรือคำสั่งมีอยู่ใน PATH คำสั่งหรือชื่อไฟล์ก็เพียงพอแล้วที่จะเรียกใช้ ไม่จำเป็นต้องใช้พาธแบบเต็ม

ไวยากรณ์:

intexclp(const char *ไฟล์, const char *โกรธ,...,โมฆะ);

เราสามารถเขียนตัวอย่าง execl() ใหม่ได้โดยใช้ฟังก์ชันระบบ execlp() ดังนี้:

#รวม

intหลัก(โมฆะ) {
char *ชื่อโปรแกรม= 'แอล';
char *arg1= '-ล';
char *arg2= '/บ้าน';

exclp(ชื่อโปรแกรม,ชื่อโปรแกรม,arg1,arg2,โมฆะ);

กลับ 0;
}

ผ่านแต่ชื่อคำสั่ง ลส ไม่ใช่เส้นทางเต็ม / bin / ls . อย่างที่คุณเห็น ฉันได้ผลลัพธ์เท่าเดิม

execv() ฟังก์ชั่นระบบ:

ในฟังก์ชัน execl() พารามิเตอร์ของไฟล์เรียกทำงานจะถูกส่งไปยังฟังก์ชันเป็นอาร์กิวเมนต์ที่แตกต่างกัน ด้วย execv() คุณสามารถส่งพารามิเตอร์ทั้งหมดใน NULL สิ้นสุด array argv . องค์ประกอบแรกของอาร์เรย์ควรเป็นเส้นทางของไฟล์เรียกทำงาน มิฉะนั้น ฟังก์ชัน execv() จะทำงานเหมือนกับฟังก์ชัน execl()

ไวยากรณ์:

intผู้บริหาร(const char *เส้นทาง, char *constargv[]);

เราสามารถเขียนตัวอย่าง excl() ใหม่ได้ดังนี้:

#รวม

intหลัก(โมฆะ) {
char *binaryPath= '/ bin / ls';
char *args[] = {binaryPath, '-ล', '/บ้าน',โมฆะ};

ผู้บริหาร(binaryPath,args);

กลับ 0;
}

อย่างที่คุณเห็น ฉันได้รับผลลัพธ์ที่ถูกต้อง

execvp() ฟังก์ชั่นระบบ:

ทำงานในลักษณะเดียวกับฟังก์ชันระบบ execv() แต่มีการใช้ตัวแปรสภาพแวดล้อม PATH ดังนั้น ไม่จำเป็นต้องใช้พาธแบบเต็มของไฟล์เรียกทำงาน เช่นเดียวกับใน execlp()

ไวยากรณ์:

intexecvp(const char *ไฟล์, char *constargv[]);

เราสามารถเขียนตัวอย่าง execv() ใหม่ได้ดังนี้:

#รวม

intหลัก(โมฆะ) {
char *ชื่อโปรแกรม= 'แอล';
char *args[] = {ชื่อโปรแกรม, '-ล', '/บ้าน',โมฆะ};

execvp(ชื่อโปรแกรม,args);

กลับ 0;
}

อย่างที่คุณเห็น ผลลัพธ์ที่ถูกต้องจะปรากฏขึ้น

execle() ฟังก์ชั่นระบบ:

ทำงานเหมือนกับ execl() แต่คุณสามารถระบุตัวแปรสภาพแวดล้อมของคุณเองได้ ตัวแปรสภาพแวดล้อมจะถูกส่งผ่านเป็นอาร์เรย์ สิ่งแวดล้อม . องค์ประกอบสุดท้ายของ สิ่งแวดล้อม อาร์เรย์ควรเป็น NULL องค์ประกอบอื่นๆ ทั้งหมดมีคู่คีย์-ค่าเป็นสตริง

ไวยากรณ์:

intผู้บริหาร(const char *เส้นทาง, const char *โกรธ,...,โมฆะ, char * constสิ่งแวดล้อม[] );

ตัวอย่างของฟังก์ชันระบบ execle() แสดงไว้ด้านล่าง:

#รวม

intหลัก(โมฆะ) {
char *binaryPath= '/bin/ทุบตี';
char *arg1= '-ค';
char *arg2= 'ไล่ออก'ไปที่ $HOSTNAME:$PORT จากเบราว์เซอร์ของคุณ'';
char *constสิ่งแวดล้อม[] = {'HOSTNAME=www.linuxhint.com', 'พอร์ต=8080',โมฆะ};

ผู้บริหาร(binaryPath,binaryPath,arg1,arg2,โมฆะ,สิ่งแวดล้อม);

กลับ 0;
}

ฉันผ่านสองตัวแปรสภาพแวดล้อม ชื่อโฮสต์ และ ท่า ไปยังฟังก์ชัน execle() อย่างที่คุณเห็น ฉันสามารถเข้าถึงได้จากไฟล์ปฏิบัติการ /bin/bash .

execve() ฟังก์ชั่นระบบ:

เช่นเดียวกับ execle() คุณสามารถระบุตัวแปรสภาพแวดล้อมของคุณเองพร้อมกับ execve() คุณยังสามารถส่งผ่านอาร์กิวเมนต์เป็นอาร์เรย์ได้เช่นเดียวกับใน execv()

ไวยากรณ์:

intผู้บริหาร(const char *ไฟล์, char *constargv[], char *constสิ่งแวดล้อม[]);

ตัวอย่าง execle() สามารถเขียนใหม่ได้ดังนี้:

#รวม

intหลัก(โมฆะ) {
char *binaryPath= '/bin/ทุบตี';
char *constargs[] = {binaryPath, '-ค', 'ไล่ออก'ไปที่ $HOSTNAME:$PORT
จากเบราว์เซอร์ของคุณ'',โมฆะ};
char *constสิ่งแวดล้อม[] = {'HOSTNAME=www.linuxhint.com', 'พอร์ต=8080',โมฆะ};

ผู้บริหาร(binaryPath,args,สิ่งแวดล้อม);

กลับ 0;
}

อย่างที่คุณเห็น เราได้ผลลัพธ์เหมือนกับในตัวอย่าง execle()

นั่นคือวิธีที่คุณใช้ตระกูลฟังก์ชัน exec ใน C สำหรับการเขียนโปรแกรมระบบใน Linux ขอบคุณที่อ่านบทความนี้