2010-02-18 6 views

답변

10

글쎄, 다른 답변은 대부분입니다.

시스템은 forks이고 execs가 아니며 프로세스가 exec이 아니며 프로그램을 인수로 전달하여 기본 셸을 실행합니다. 당신이 정말로 (매개 변수 구문 분석 등을위한) 쉘을 원하지 않는

그래서, 그것은이다 많은 같은 것을 할 것이 더 효율적 :

int i = fork(); 
if (i != 0) { 
    exec*(...); // whichever flavor fits the bill 
} else { 
    wait(); // or something more sophisticated 
} 
7

exec 패밀리는 현재 프로세스를 새 프로세스로 바꿉니다. system은 새 프로세스를 포크하고 완료 될 때까지 대기합니다. 어느 것을 사용할지는 당신이 원하는 것에 달려 있습니다.

루프에서 이렇게하기 때문에 원본 프로세스를 바꾸지 않으려 고합니다. 따라서 system과 (과) 함께 시도해 보시기 바랍니다.

+1

시스템도하는 수도, 라인 구문 분석을 명령 라인을 과목을 주입 공격을위한 구멍을 열어 라. – falstro

+0

웹에서이 튜토리얼을 찾아 보았습니다. 대부분의 예제에서는 fork()가 새로운 프로세스를 실행하고 execvp()로 포크를 대체했습니다. 그 후, 부모 프로세스는 자식 프로세스가 완료되기를 기다렸다. 이것은 기본적으로 system()이하는 것입니까? – helpermethod

+1

예, 기본적으로'system()'이하는 일입니다. 'system()'을 호출하면 기본 쉘이 실행되고 프로그램을 인수로 전달하므로 인수가 조금 더 오버 헤드가됩니다. – jschmier

5

시스템에서 원하는 것을 얻을 수없는 경우에만 execvp를 사용합니다. 시스템에 해당하는 것을 얻으려면 execvp, fork 및 일부 신호 처리가 필요합니다.

관련 문제