2014-04-12 3 views
-2

"ls r"을 입력하므로 간단한 코드를 작성하려고합니다. 코드가 올바른지 확인하고 싶습니다. 출력물에 아무것도 표시되지 않습니다. 다음 코드입니다.execvp를 사용하여 C에서 ls 명령을 작성하는 방법

int main(void){ 

    char *line; 
    char *args[16]; 
    pid_t pid; 

    line = (char*)malloc(1024); 
    printf("$ "); 
    fgets(line,1024,stdin); 
    args[0] = strtok(line, " "); 
    args[1] = strtok(NULL, " "); 

    printf("%s\n" , args[0]); 
    printf("%s", args[1]); 

    execvp(args[0], args); 
} 

감사합니다.

답변

0

기존의 무료 소프트웨어 쉘 (즉 sash 또는 bash)의 소스 코드 내부 모습과는

읽기 execvp(3) man 페이지 Advanced Linux Programming를 참조하십시오. execvp이 실패 할 수 있습니다. 성공하면 을 반환하지 않습니다! 또한 stdout(3)이고 버퍼는입니다. fflush(3)으로 전화해야합니다.

int main(void){ 
char line[1024]; 
char *args[16]; 
memset (args, 0, sizeof(args)); 
printf("$ "); 
fflush(NULL); 
fgets(line,sizeof(line),stdin); 
args[0] = strtok(line, " "); 
args[1] = strtok(NULL, " "); 
printf("%s\n" , args[0]); 
printf("%s", args[1]); 
fflush(NULL); 
execvp(args[0], args); 
perror("execvp"); 
return EXIT_FAILURE; 
} 

을 관련 #include 지시를 잊지 마세요 :

당신은 아마 몇 가지 기본적인 이해를 누락 첫 번째 시도

을 (쉘이 forking 과정입니다 ... 또한 fork(2) & execve(2) 등 읽기) fflush(3), fgets, execvp, perror이 필요합니다.

읽기 또한 errno(3), syscalls(2) ... gcc -Wall -g를 사용

컴파일. 디버거 사용 방법 배우기 gdbstrace

참고 : 실제 쉘은 strtok(3)을 사용하지 않습니다. 그들은 선을 명시 적으로 구문 분석합니다 (쉘은 백 슬래시 또는 따옴표가있는 공백을 이스케이프 할 수 있기 때문에해야합니다).

실제로, 시도하십시오 strace ls; /bin/lsstat(2)입니다.

+0

고급 Linux 프로그래밍에 대한 링크가 끊어졌습니다. – ajay

+0

감사합니다. 수정되었습니다! –

+0

감사합니다. 출력은 이제 "exevcp : bad address"가 무엇을 의미합니까? – tokenaizer

관련 문제