2017-11-24 5 views
1

C 프로그램에서 execvp()을 사용하여 netcat 수신기를 만듭니다. 프로그램이 종료되면 리스너를 죽이고 싶습니다. 예 :execvp 프로세스를 종료하는 방법

int main(){ 
    char *listener[] = { 
    "/bin/bash", 
    "-c", 
    "nc -l 1338 > text.tar", 
    NULL 
    }; 
    execvp(listener[0], listener); 
    return 0; 
} 

프로그램이 종료되기 전에이 netcat 프로세스를 종료하고 싶습니다. 그러나 나는이 코드를보고 netcat 리스너가 데이터를 받기 전에 프로그램이 종료 될 것이라고 생각하고있다. 대기 명령을 내릴 수도 있습니다.

  • 가 어떻게이 execvp는의 였는지를 죽일 수 있습니다

    나는이 두 가지 질문으로 귀결 것 같아요?

  • netcat에 시간을주기 위해 wait() 전화가 필요합니까?
+0

https://serverfault.com/questions/512722/automatically-close-netcat-connection – ymonad

+0

@ymonad, netcat 수신기를 열고 클라이언트가 일부 데이터를 보내고 서버를 타르로 누른 다음 수신자를 닫습니다. – yasgur99

+0

예. 나는'-c' 또는'-q' (netcat 변형에 의존)를'nc'에 줄 수 있고, 전송이 끝나면 클라이언트로부터'EOF'를 보낼 수 있음을 의미합니다. 이 옵션을 사용할 수없는 이유가 있습니까? – ymonad

답변

3

execexec 함수 패밀리는 오류가있을 때만 반환됩니다 (즉, 프로그램을 실행할 수 없음).

먼저 fork()이어야하고 pid를 추적해야합니다. 그러나 주 프로그램이 끝나기 바로 전에 자식 프로세스를 죽이고 싶다면 아무 것도 할 시간이 없을 것입니다. 여기

우리가 (-C 제어처럼, 또는 SIGINT 사용) SIGTERM 신호를 사용하는 것이

#include <sys/types.h> 
#include <signal.h> 

#define TIME 10 

int main(){ 
    char *listener[] = { 
    "/bin/bash", 
    "-c", 
    "nc -l 1338 > text.tar", 
    NULL 
    }; 
    pid_t pid = fork(); 
    if (! pid) { // child 
     execvp(listener[0], listener); 
     // doesn't return (check error maybe) 
    } 
    printf("Waiting for %d seconds...\n", TIME); 
    sleep(TIME); 
    kill(pid, SIGTERM); 
    return 0; 
} 

를 살해하기 전에 자식 프로세스가 10 초를주고, 필요하면 다른 하나를 선택하기 위해 man page을 확인 . SIGKILL은 "가장 강한"것입니다 (어린이가 잡을 수 없음).

+0

Control-C는'SIGQUIT'가 아니라'SIGINT'를 보냅니다. 일반적으로 정중 한 것을 죽이고 싶다면'SIGTERM'을 사용합니다. 정말로 무언가를 죽이고 싶지만 정중함을 시험하고 싶다면 표준 방법은'SIGTERM'을 보내고 몇 초를 기다린 후 프로세스가 여전히 존재하면'SIGKILL'을 보낸다. –

+0

감사합니다. 어느 것이^C인지 기억하지 못했습니다 ... 매뉴얼 페이지가 QUIT에 번호 3을 부여했기 때문에 잘못된 선택을했습니다 .. –

+0

신호가 과거에 그런 식으로 매핑되었는지는 확실하지 않지만 지금은 그런 식으로 작동하지 않습니다.예를 들어,^D는 EOF입니다. 이것은'SIGILL '대신에 전혀 신호가 아니기 때문에 프로그램이 잘못된 명령을 실행하려고했다고 생각하게 만듭니다. –