나는 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;
}
당신은 path' 당신이 그것을 않는 생각이 들어 '체크 된 적이 있습니까? 특히'strtok()'는 작동 방식이 다소 악명 높고 규칙에 따라 정확하게 실행되지 않으면 쉽게 쓰레기를 생성 할 수 있습니까? – geekosaur
내가 볼 수있는 것은 아무것도 아니다. 왜'strtok'이 올바른 일을하는지'path'의 최종 내용을 표시하기 위해'printf()'를 던지지 마십시오.'execve' 호출 자체는 괜찮아 보입니다. –
환경을 비어있는 이유는 무엇입니까? 현재 환경을 사용하려면 보통'execv()'를 사용하거나 execve()에 세 번째 인수로'environ'을 전달해야합니다. 이것이 당신의 문제의 근원인지는 의심 스럽지만 더 나은 습관입니다. (또한,'execv (newargv [0], newargv); 또는'execve (newargv [0], newargv, environ); '를 사용하는 것이 현명하다. 'exec *()'함수 : 반환 된 경우 실패하고, 성공하면 반환하지 않습니다.) –