2012-04-13 2 views
1

명령을 받아 실행하는 작은 쉘 프로그램을 작성하고 있습니다. 사용자가 유효하지 않은 명령을 입력하면 if 문은 -1을 반환합니다. 명령이 올 바르면 명령을 실행하지만 일단 명령을 실행하면 프로그램이 종료됩니다. 내가 그 뒤에 코드 줄을 실행하지 않는다면 내가 뭘 잘못하고 있니? 나는 execvp (command.argv [0], command.argv)를 ls 및 cat 명령으로 테스트 했으므로 작동하는지 확실히 확인했습니다. 여기 내 코드가있다. exec 함수() 가족이 와execvp (command.argv [0], command.argv) 후 프로그램이 중지됩니다.

그래서 현재의 프로세스 이미지가 덮어 씁니다 새로운 프로세스 이미지를 현재 프로세스 이미지를 대체 execvp(3)

man page에서

int shell(char *cmd_str){ 
    int commandLength=0; 
    cmd_t command; 
    commandLength=make_cmd(cmd_str, command); 
    cout<< commandLength<<endl; 
    cout << command.argv[0]<< endl; 
    if(execvp(command.argv[0], command.argv)==-1) 
//if the command it executed nothing runs after this line 
    { 
    commandLength=-1; 

}else 
{ 
    cout<<"work"<<endl; 
} 

    cout<< commandLength<<endl; 
    return commandLength; 


} 
+0

정확히'exec *'함수가 어떻게 작동할까요? 그들은 새 프로그램을로드하고 새 프로그램으로 프로그램을 다시 작성합니다. –

+3

@Aaron : 항공기 조종사는 최소한 "작업 할"항공기의 매뉴얼 **을 읽어야합니다. 프로그래머로서의 당신에 대한 기대가 어떠세요? – ereOn

답변

6

당신 명령의 이미지! 따라서 항상 fork+exec 조합을 사용해야 만 명령이 하위 프로세스에서 실행되고 현재 프로세스가 상위 프로세스로 안전하게 계속 진행됩니다.

가벼운 메모에서 그림과 함께 문제를 설명하고 싶습니다. 그림이 천개의 단어를 말합니다. 기분 나쁘게는 :) 의도하지 :)

enter image description here

0

를 문서에서 exec

exec 함수() 가족이 새로운 프로세스 이미지로 현재 프로세스 이미지를 대체하십시오. 이 매뉴얼 페이지에서 설명하는 함수는 execve (2)의 프론트 엔드입니다. (현재 프로세스 이미지의 대체에 대한 자세한 내용은> execve (2) 매뉴얼 페이지를 참조하십시오.

계속 하시겠습니까? 사용하려는 기능이 아닙니다.

0

@Pavan - 자신과 같은 니트 피커에게는 기술적으로 "현재 프로세스가 사라졌습니다."라는 진술은 사실이 아닙니다. 그것은 여전히 ​​동일한 프로세스이며, 동일한 PID로 다른 이미지 (코드, 데이터 등)로 덮어 씁니다.

+0

@ Pavan의 질문에 주석으로 작성하거나 완전하고 정확한 답변을 작성해야합니다. – crashmstr

+0

영어는 당신이 알고있는 phunny language입니다 :) 나는 나의 대답을 바꾸어 말했습니다. –

+0

@crashmstr : 나는이 남자가 코멘트 문턱 밑이라고 생각한다. – Puppy

관련 문제