Vì vậy, ở đây chúng ta phải truyền tên tệp hai lần trong hàm.
Chúng không hoàn toàn giống như bạn nhận thấy bằng cách quan sát rằng một trong số chúng được sử dụng làm argv[0]
giá trị. Điều này không phải giống như tên cơ sở của tệp thực thi; nhiều / hầu hết mọi thứ bỏ qua nó và bạn có thể đặt bất cứ thứ gì bạn muốn vào đó.
Đầu tiên là đường dẫn thực tế để thực thi, trong đó có một sự cần thiết rõ ràng. Cái thứ hai được truyền cho quá trình bề ngoài như tên được sử dụng để gọi nó, nhưng, vd:
execl("/bin/ls", "banana", "-l", NULL);
Sẽ làm việc tốt, giả định /bin/ls
là con đường chính xác.
Một số ứng dụng, tuy nhiên, sử dụng argv[0]
. Thông thường chúng có một hoặc nhiều symlink trong $PATH
; điều này là phổ biến với các tiện ích nén (đôi khi họ sử dụng trình bao bọc thay thế). Nếu bạn đã xz
cài đặt, stat $(which xzcat)
hiển thị đó là một liên kết đến xz
, và man xzcat
giống như man xz
giải thích "xzcat tương đương với xz --decompress --stdout". Cách xz có thể cho biết nó được gọi như thế nào bằng cách kiểm tra argv[0]
, làm cho các giá trị này tương đương:
execl("/bin/xz", "xzcat", "somefile.xz", NULL);
execl("/bin/xz", "xz", "--decompress", "--stdout", "somefile.xz", NULL);
busybox
có thể là những gì bạn muốn nó phụ thuộc vào cách bạn gọi nó phải không?