cuốn sách gpt4 ai đã làm

c - execvp hình ảnh tiến trình mới và thoát

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 06:17:18 26 4
mua khóa gpt4 Nike

Tôi có mã này:

int main(int argc, char *argv[]) {

cho (int i = 1; i < argc; i++) {
pid_t pid = nĩa();

nếu ( !pid ) {
char *aux[] = {argv[i], NULL};
execvp(aux[0], aux);
printf("\nChild %d đã thực thi %s với mã thoát %d\n", getpid(), aux[0], i);
_exit(i);
}

}

cho (int i = 1; i < argc; i++) {
printf("Đứa trẻ chết\n");
chờ đợi(NULL);
}

return 0;
}

Khi chạy tôi nhận thấy printf(...) sau execvp trên tiến trình con không bao giờ chạy. tôi đã kiểm tra người đàn ông điều hành Nơi tôi tìm thấy nó:

"Nhóm hàm exec() thay thế hình ảnh quy trình hiện tại bằng hình ảnh quy trình mới."

Điều này có ý nghĩa gì khác ngoàiprintfngoài,_thoát(i)Cũng không được thực hiện? Nếu vậy, làm thế nào tôi có thể giết quá trình con? Hình ảnh quy trình mới execvp có xử lý được việc này không?

EDIT: Giả sử tôi muốn thực thi printf (hoặc bất kỳ lệnh nào khác) sau dòng execvp như trong mã, có cách nào không?

EDIT[2]: Làm cho nó rõ ràng hơn. Nếu tôi có khối này:

int chính(void) {

vì (int i = 0; i < 10; i++) {
pid_t pid = nĩa();

nếu (!pid) {
printf("con %d\n", getpid());
//_exit(1);
}

khác {
chờ đợi(NULL);
printf("cha ở đây\n");
}
}

return 0;
}

lối ra (1) Mọi thứ trở nên điên rồ khi được chú thích. Vì vậy, câu hỏi của tôi là: nó có tồn tại không giám đốc điều hành thực thi chính xác và tiến trình con ban đầu (tiến trình gọi execvp) không hoạt động như _thoát(n) Việc gọi một tình huống thoát như vậy sẽ tạo ra kết quả như trong khối trên.

câu trả lời hay nhất

Điều này có nghĩa là ngoài printf, _exit(i) cũng không được thực thi phải không?

Đúng. Trừ khi execvp()(và các chức năng họ thực thi khác) không thành công, nếu không nó sẽ trả về và printf()_ra() Tuyên bố sẽ được thực thi.

Nếu vậy, làm cách nào tôi có thể tắt tiến trình con? Hình ảnh quy trình mới execvp có giải quyết được vấn đề đó không?

execvp() Không giết tiến trình con - nó thậm chí không biết rằng tiến trình mà nó thay thế là tiến trình con.

Trong hầu hết các tình huống thực tế, bạn không muốn "giết" tiến trình con. bạn muốn sử dụng chờ đã(2)Chờ đợiQuá trình con hoàn tất - bạn đã thực hiện việc này. Các tiến trình con độc lập giống như tiến trình "chính" của bạn; chủ yếu() Chúng thoát ra khi quay trở lại hoặc bằng cách gọi exit()/_exit, v.v. hoặc khi chúng chấm dứt một cách bất thường (ví dụ: bị tắt bởi tín hiệu SIGTERM/SIGKILL).

Về việc sao chép và thoát quy trình mới c - execvp, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/42816223/

26 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress