ดังนั้นที่นี่เราต้องส่งชื่อไฟล์สองครั้งในฟังก์ชั่น
พวกเขาไม่เหมือนกับที่คุณสังเกตเห็นโดยสังเกตว่าหนึ่งในนั้นถูกใช้เป็นargv[0]
ค่า สิ่งนี้ไม่จำเป็นต้องเหมือนกันกับชื่อฐานของไฟล์สั่งการ หลาย ๆ สิ่งส่วนใหญ่ไม่สนใจมันและคุณสามารถใส่อะไรก็ได้ที่คุณต้องการ
คนแรกคือเส้นทางที่แท้จริงไปยังปฏิบัติการที่มีความจำเป็นที่ชัดเจน คนที่สองจะถูกส่งผ่านไปยังกระบวนการอย่างเห็นได้ชัดเป็นชื่อที่ใช้ในการเรียกมัน แต่เช่น:
execl("/bin/ls", "banana", "-l", NULL);
จะทำงานได้ดีสันนิษฐานว่า/bin/ls
เป็นเส้นทางที่ถูกต้อง
บางโปรแกรมทำ argv[0]
แต่ทำให้การใช้งานของ เหล่านี้มักจะมีหนึ่งหรือมากกว่า symlinks ใน$PATH
; นี่เป็นเรื่องปกติที่มีอรรถประโยชน์การบีบอัด (บางครั้งพวกเขาใช้ shell wrappers แทน) หากคุณxz
ติดตั้งแล้วstat $(which xzcat)
แสดงว่าเป็นลิงก์ไปยังxz
และman xzcat
เหมือนกับman xz
ที่อธิบาย "xzcat เทียบเท่ากับ xz --decompress --stdout" วิธีที่ xz สามารถบอกได้ว่ามันถูกเรียกใช้โดยการตรวจสอบargv[0]
ทำให้เทียบเท่าเหล่านี้:
execl("/bin/xz", "xzcat", "somefile.xz", NULL);
execl("/bin/xz", "xz", "--decompress", "--stdout", "somefile.xz", NULL);
busybox
ว่าคุณต้องการให้มันเป็นอย่างไรขึ้นอยู่กับว่าคุณเรียกมันว่าถูกต้องอย่างไร?