Tôi đang cố gắng theo dõi một vụ tai nạn rất kỳ quặc. Điều kỳ lạ về nó là một cách giải quyết mà ai đó đã khám phá và điều tôi không thể giải thích được.cách exec có thể thay đổi hành vi của chương trình exec'ed
Cách giải quyết là chương trình nhỏ này mà tôi sẽ đề cập đến là 'Á hậu':
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[])
{
if (argc == 1)
{
fprintf(stderr, "Usage: %s prog [args ...]\n", argv[0]);
return 1;
}
execvp(argv[1], argv + 1);
fprintf(stderr, "execv failed: %s\n", strerror(errno));
// If exec returns because the program is not found or we
// don't have the appropriate permission
return 255;
}
Như bạn có thể thấy, tất cả chương trình này thực hiện là sử dụng execvp
để thay thế bản thân với một chương trình khác nhau.
Các chương trình bị treo khi nó được gọi trực tiếp từ dòng lệnh:
/path/to/prog args # this crashes
nhưng hoạt động tốt khi nó gián tiếp được gọi qua Á hậu shim tôi:
/path/to/runner /path/to/prog args # works successfully
Đối với cuộc sống của tôi, Tôi có thể tìm ra cách có thêm một exec có thể thay đổi hành vi của chương trình đang chạy (vì bạn có thể thấy chương trình không thay đổi môi trường).
Một số nền về sự cố. Bản thân sự cố xảy ra trong thời gian chạy C++. Cụ thể, khi chương trình thực hiện throw
, phiên bản lỗi không chính xác cho rằng không có kết quả nào phù hợp (mặc dù có) và gọi số terminate
. Khi tôi gọi chương trình qua Á hậu, ngoại lệ được bắt đúng cách.
Câu hỏi của tôi là bất kỳ ý tưởng nào tại sao exec bổ sung thay đổi hành vi của chương trình exec'ed?
Tôi không biết: Nhưng execvp có thay đổi thư mục làm việc không? Bạn đang đi qua đối số nào? –
@MartinYork - AFAIK, 'execvp' không bao giờ thay đổi thư mục làm việc (yêu cầu cuộc gọi đến' chdir' và runner không làm điều đó). Các đối số cụ thể không liên quan; hành vi được mô tả là độc lập với các đối số cụ thể được truyền cho chương trình. –
Nó có làm điều tương tự nếu bạn sử dụng 'execv()' thay vì 'execvp()'? – caf