현재 C로 신호를 테스트하여 fork() 메소드로 생성 된 하위 프로세스를 제어하려고합니다. 본질적으로, 나는 자식 프로세스가 "yes"명령을 리눅스 터미널에서 실행하고있다.이 명령은 "y"와 줄 바꿈이 끝날 때까지 출력한다. CTRL-Z를 사용하여이 프로세스를 일시 중지/재개 할 수 있기를 원합니다. 이것은 내가 지금 뭘 찾았는지입니다 ".. Ctrl 키-Z 아동 일시 중지를 누르면"신호 처리기를 사용하여 하위 프로세스 일시 중지/재시작
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
pid_t CHILD_PROCESS;
pid_t PARENT_PROCESS;
int isPaused;
void pause_handler(int signo){
if(!isPaused){
printf("Ctrl-Z pressed. Pausing child.\n");
isPaused = 1;
kill(CHILD_PROCESS,SIGSTOP);
}
else if(isPaused){
printf("\nCtrl-Z pressed. Resuming child.\n");
kill(CHILD_PROCESS,SIGCONT);
isPaused = 0;
}
}
int main(int argc, char** argv){
pid_t pid;
PARENT_PROCESS = getpid();
pid = fork();
if(pid == 0){
system("yes");
}
isPaused = 0;
if(pid > 0){
signal(SIGTSTP, SIG_IGN);
signal(SIGSTOP, SIG_IGN);
CHILD_PROCESS = pid;
while(1){
if(signal(SIGTSTP,pause_handler) == SIG_ERR){
printf("Signal Failure");
}
}
}
}
내가 이것을 실행하면, 내가 얻을 수 있습니다 CTRL-Z를 눌러 콘솔에 인쇄하면 "Ctrl-Z를 눌렀습니다."라는 메시지가 나타납니다. CTRL-Z를 다시 눌러 콘솔에 인쇄하십시오. 그러나 실제로 "y"를 반복해서 인쇄하지는 않습니다. 자식 프로세스가 왜 다시 시작되지 않는지에 대한 아이디어가 있습니까?
'canonical'Q & A는 [신호 처리기에서 'printf()'를 사용하지 않는 방법입니까?] (http://stackoverflow.com/questions/16891019/how-to-avoid-using-printf-in- a-signal-handler /) –