Tôi đang mã hóa một trình bao cơ bản trong C và tôi đang làm việc để tạm ngưng quá trình con ngay bây giờ.Sau khi tạm ngưng quá trình con bằng SIGTSTP, trình bao không phản hồi
Tôi nghĩ rằng trình xử lý tín hiệu của tôi là chính xác và quá trình con của tôi đang tạm dừng, nhưng sau đó, thiết bị đầu cuối phải quay lại quy trình gốc và điều đó không xảy ra.
Đứa trẻ bị tạm ngưng nhưng vỏ của tôi không đăng ký bất kỳ đầu vào hoặc đầu ra nào nữa. tcsetpgrp() dường như không giúp ích gì.
Dưới đây là xử lý tín hiệu của tôi trong mã shell của tôi cho SIGTSTP:
void suspend(int sig) {
pid_t pid;
sigset_t mask;
//mpid is the pgid of this shell.
tcsetpgrp(STDIN_FILENO, mpid);
tcsetpgrp(STDOUT_FILENO, mpid);
sigemptyset(&mask);
sigaddset(&mask, SIGTSTP);
sigprocmask(SIG_UNBLOCK, &mask, NULL);
signal(SIGTSTP, SIG_DFL);
//active.pid is the pid of the child currently in the fg.
if (active.pid != 0) {
kill(active.pid, SIGTSTP);
}
else{
//if this code is being run in the child, child calls SIGTSTP on itself.
pid = getpid();
if (pid != 0 && pid != mpid){
kill(pid, SIGTSTP);
}
}
signal(SIGTSTP, suspend);
}
bất cứ ai có thể cho tôi biết những gì tôi đang làm sai?
Tôi có đang treo vỏ của mình cùng với đứa trẻ không và tôi có cần trả về stdin và stdout cho vỏ không? Làm thế nào tôi sẽ làm điều này?
Cảm ơn!
Cảm ơn bạn đã trả lời. Tôi đã cố gắng làm những gì bạn nói, nhưng khi tôi lấy đi bộ xử lý tín hiệu của tôi thiết bị đầu cuối chỉ đình chỉ cha mẹ và trở về bash. Tôi cần phụ huynh tiếp tục chạy. – user1710304
Điều này là sai, không bắt SIGTSTP chắc chắn sẽ gây ra vỏ của mình để đình chỉ và sẽ cho phép các tiến trình trẻ em đi vào. Anh ta cần bắt nó để vỏ của anh ta không bị treo. Tôi đang đối mặt với cùng một vấn đề ngay bây giờ, ông phải đối mặt trước đó – Fingolfin
@AdelQodmani, chỉ nhóm tiến trình tiền cảnh của thiết bị đầu cuối mới nhận được SIGTSTP khi bạn nhấn Ctrl-Z. Trình bao chỉ đợi kết thúc quá trình mà nó bắt đầu, nằm trong một nhóm tiến trình không phải là nhóm tiến trình nền trước của thiết bị đầu cuối. bạn có thể _ignore_ SIGTSTP nếu bạn thích, đó là có thể xảy ra những gì hầu hết các shell làm. Quan điểm của tôi là bạn cần phải chơi với nhóm tiến trình tiền cảnh của thiết bị đầu cuối. –