2012-04-15 4 views
1

나는 execve에 몇 가지 문제가있다. 나는 bash 쉘처럼 작동 할 수있는 쉘을 만들려고 노력하고 있지만, 명령을 실행하는 fork 된 자식에 문제가있다. 여기에 내가 아이를 위해 가지고있는 것이있다. . cmd를 내가이 프로그램을 실행하면, 내가 perror는이 오류를 얻을 그러나 사용자가에 입력하는 명령을 숯불 *입니다 : 나는 간단한 LS와 프로그램을 시도execve - 해당 파일이나 디렉토리가 없습니까?

execve error: No such file or directory. 

, 그것은해야한다 path = "/ bin/ls"을 실행하고 (이것이 나의 ls 명령이 어디에 있는지 확인했다.) 그러나 여전히 불평하고있다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 감사!

CODE :

if(pid == 0){ 

    // Parse the command 
    char * word = strtok(cmd, " "); 
    char path[128] = "/bin/"; 
    strcat(path, word); 

    // Execute the process 
    char * newenvp[] = { NULL }; 
    char * newargv[] = { path, NULL }; 
    ret = execve(path, newargv, newenvp); 
    if(ret == -1){ 
     perror("execve error"); 
    } 

    return EXIT_SUCCESS; 

} 
+0

당신은 path' 당신이 그것을 않는 생각이 들어 '체크 된 적이 있습니까? 특히'strtok()'는 작동 방식이 다소 악명 높고 규칙에 따라 정확하게 실행되지 않으면 쉽게 쓰레기를 생성 할 수 있습니까? – geekosaur

+0

내가 볼 수있는 것은 아무것도 아니다. 왜'strtok'이 올바른 일을하는지'path'의 최종 내용을 표시하기 위해'printf()'를 던지지 마십시오.'execve' 호출 자체는 괜찮아 보입니다. –

+0

환경을 비어있는 이유는 무엇입니까? 현재 환경을 사용하려면 보통'execv()'를 사용하거나 execve()에 세 번째 인수로'environ'을 전달해야합니다. 이것이 당신의 문제의 근원인지는 의심 스럽지만 더 나은 습관입니다. (또한,'execv (newargv [0], newargv); 또는'execve (newargv [0], newargv, environ); '를 사용하는 것이 현명하다. 'exec *()'함수 : 반환 된 경우 실패하고, 성공하면 반환하지 않습니다.) –

답변

4

가 나는 것 할 것 첫번째 것은 삽입 : execve 호출하기 전에

printf ("[%s]\n", path); 

. 그 실행 파일이 당신이 생각하는 것임을 확인해야합니다.

당신이 그것으로 공급하고 입력이 정확하고 실행 실제로 사용할 수입니다 괜찮 로 당신의 코드가 보이는.

#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 

int main (int argc, char *argv[]) { 
    if (argc > 1) { 
     char * word = strtok (argv[1], " "); 
     char path[128] = "/bin/"; 
     strcat (path, word); 

     char * newenvp[] = { NULL }; 
     char * newargv[] = { path, NULL }; 
     printf ("[%s]\n", path); 
     int ret = execve (path, newargv, newenvp); 
     if (ret == -1) { 
      perror("execve error"); 
     } 
    } 
    return 0; 
} 

출력, 내가 ./testprog ls의 라인을 따라 뭔가를 실행할 때 :

[/bin/ls] 
kidsshares.ods paxwords birthdays homeloantracking.gnumeric 
shares2011.ods backup0.sh development lexar 
accounts.ods backup1.sh photos  testprog.c 
testprog 
+0

문제를 발견했습니다. 제안에 감사드립니다! write()로 내 경로를 인쇄하고 있는데, null null 종결자가 누락되었다는 사실을 무시했습니다. – theeggman85

0

수동으로 여행하지 않으려면 예를 들어, 다음과 같은 완전한 프로그램 내 데비안 상자에 잘 작동 올바른 바이너리를 찾으려면 파일 시스템을 통해 (추가 p)이 있어야합니다. 맨 페이지에서 는 :

The execlp(), execvp(), and execvpe() functions duplicate the actions of the shell in searching for an executable file if the specified filename does not contain a slash (/) character. The file is sought in the colon-separated list of directory pathnames specified in the PATH environment variable. If this variable isn't defined, the path list defaults to the current directory followed by the list of directories returned by confstr(_CS_PATH). (This confstr(3) call typically returns the value "/bin:/usr/bin".) [...]