2017-10-01 1 views
2

현재 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"를 반복해서 인쇄하지는 않습니다. 자식 프로세스가 왜 다시 시작되지 않는지에 대한 아이디어가 있습니까?

답변

3

결과적으로 system에는 내재 된 fork 호출이 있으므로 CHILD_PROCESS에 저장된 PID는 실제로 하위 프로세스가 아니며 대신 중간 단계가됩니다. man 3 system에서

: 우리가 execl("/bin/sh", "sh", "-c", "yes", NULL)system("yes") 전화를 교체 할 경우 원하는

The system() library function uses fork(2) to create a child process 
    that executes the shell command specified in command using execl(3) as 
    follows: 

     execl("/bin/sh", "sh", "-c", command, (char *) 0); 

    system() returns after the command has been completed. 

그래서, 우리는이 여분의 포크와 프로그램의 기능을 피할 수 있습니다.


유일한 다른 문제

내가 신호 처리기 내에서 정의되지 않은 동작을 printf이다 사용 on this post을 발견 코멘트가 있다는 것입니다. 여기 걱정할 문제는 아니지만 향후 코드를 염두에 두어야합니다.

+1

'canonical'Q & A는 [신호 처리기에서 'printf()'를 사용하지 않는 방법입니까?] (http://stackoverflow.com/questions/16891019/how-to-avoid-using-printf-in- a-signal-handler /) –

관련 문제