Tôi có một chức năng mà Forks một quá trình, mô tả file trùng lặp cho đầu vào và đầu ra bộ đệm, và sau đó chạy execl
trên một lệnh được thông qua vào thông qua một chuỗi gọi cmd
:Chụp thoát mã trạng thái của quá trình con
static pid_t
c2b_popen4(const char* cmd, int pin[2], int pout[2], int perr[2], int flags)
{
pid_t ret = fork();
if (ret < 0) {
fprintf(stderr, "fork() failed!\n");
return ret;
}
else if (ret == 0) {
/*
Assign file descriptors to child pipes (not shown)...
*/
execl("/bin/sh", "/bin/sh", "-c", cmd, NULL);
fprintf(stderr, "execl() failed!\n");
exit(EXIT_FAILURE);
}
else {
/*
Close parent read and write pipes (not shown)...
*/
return ret;
}
return ret;
}
Mỗi trường hợp cmd
xử lý dữ liệu của tôi một cách chính xác, miễn là các đầu vào thử nghiệm của tôi là chính xác.
Khi dữ liệu xấu sẽ được chuyển cho một quá trình con, chương trình cha mẹ của tôi sẽ chạy đến khi kết thúc và thoát với mã trạng thái không lỗi của 0.
Nếu tôi cố tình đưa vào đầu vào xấu - để cố tình cố gắng để có được một trong các trường hợp cmd
không thành công theo cách dự kiến - tôi muốn biết cách chụp trạng thái thoát của số cmd
để tôi có thể phát hành mã trạng thái lỗi chính xác từ chương trình chính, trước khi chấm dứt.
Điều này thường được thực hiện như thế nào?
Khi tôi chạy khối mã đầu tiên của bạn (ví dụ "ví dụ"), quá trình treo trên cuộc gọi 'waitpid()'. –
@AlexReynolds: Đó là cách nó hoạt động theo mặc định, xem cập nhật để trả lời. Bạn sẽ cần một số loại chiến lược để phát hiện và sau đó đối phó với khả năng của các quá trình con chấm dứt sớm. –