tôi tự hỏi nếu mã sau đây có thể tạo ra zombie:Mã C này có thể tạo ra các quá trình zombie không?
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(){
int i=1;
pid_t p;
p = fork();
i++;
if(p!=0){
waitpid(p, NULL, 0);
}
printf("%d\n",i);
return 0;
}
Vì vậy, quá trình cha mẹ gọi waitpid cho quá trình trẻ em, trong đó trả về ngay lập tức nếu đứa trẻ đã chưa kết thúc. Vì vậy, không có zombie có thể phát sinh cho đến nay. Nhưng, nếu đứa trẻ thoát ra trước khi
return 0;lệnh này sẽ là một zombie sau đó? Tôi thực sự bối rối về nó. Nên waitpid là dòng cuối cùng của mã trước khi chương trình chấm dứt? Bất kỳ trợ giúp sẽ được đánh giá cao. Cảm ơn!
Điều đó có vẻ ổn nhưng bạn có thể có một sự hiểu lầm. 'Waitpid' sẽ trở lại ngay lập tức nếu đứa trẻ đã chết; nếu không nó sẽ chặn cho đến khi đứa trẻ chết. Trừ khi bạn sử dụng WNOHANG với waitpid trong trường hợp nó sẽ không chặn nhưng đó không phải là vấn đề ở đây. – Duck
Sửa lỗi nếu tôi sai, nhưng tôi nghĩ rằng tham số thứ ba (số không) tương đương với WHOHANG. Dù sao, chúng ta hãy giả sử nó là WHOHANG. Vậy thì một zombie sẽ được tạo ra và làm thế nào? Và cuối cùng, nên waitpid là lệnh cuối cùng trước khi trở về 0; để đảm bảo không có zombie nào được tạo ra ?. Cảm ơn một lần nữa! – mgus
Không có WNOHANG chắc chắn là không tương đương 0. Zero là mặc định và nó sẽ không có ý nghĩa bitwise-hoặc WNOHANG nếu bằng 0. Nếu đứa trẻ chết sau khi một 'waitpid' không chặn và cha mẹ đã thoát trước thì bạn sẽ có một zombie. Nhưng thông thường bạn sẽ sử dụng một 'waitpid' không chặn trong một vòng lặp và có thể kết hợp với việc nhận SIGCHLD. Waitpid chính nó có thể được bất cứ nơi nào trong mã miễn là nó xử lý con của bạn khi kêu gọi để làm như vậy. – Duck