ในบทความนี้ ฉันจะพูดถึงตระกูลของฟังก์ชัน 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 ขอบคุณที่อ่านบทความนี้