Я использую sigaction(SIGTSTP, &ctrlz_signal, NULL);
, чтобы убедиться, что я могу поймать Ctrl-Z
.
void ctrlz_signal(int sigNo) {
printf("Caught Ctrl-Z | curr_chld=%d\n", CURR_CHILD);
if(CURR_CHILD != 0) kill(CURR_CHILD, SIGTSTP);
}
CURR_CHILD
настроен путем разветвления:
sigaction(SIGTSTP, &ctrlz_signal, NULL);
int status;
CURR_CHILD = fork();
if (CURR_CHILD < 0) {
// ...
} else if (CURR_CHILD == 0) { // child
// exec(...)
} else { // back in parent
waitpid(CURR_CHILD, &status, 0); // wait for child to finish
// ...
}
Кажется, что это успешноостанавливает дочерний процесс, но затем не запускает родительский waitpid
.Я бы подумал, что будет родительский сигнал, когда я буду использовать эту функцию kill
, но похоже, что это не так, поскольку моя "оболочка" застревает на этой строке waitpid
.
Как мне сделать так, чтобы после нажатия Ctrl-Z
процесс, выполняющий команду exec
(которая на тот момент была дочерней), был помещен в фоновый режим (остановлен), а затем родительскийпроцесс должен получить контроль над потоком программы?