2016-10-12 1 views
-2
void main() { 
    char *args[MAX_LINE]; 
    char arg1[MAX_LINE/2] = "\0"; 
    char arg2[MAX_LINE/2] = "\0"; 
    printf("ubos>"); 
    fflush(stdout); 
    fgets(arg1, sizeof(arg1), stdin); 
    arg1[strlen(arg1) - 1] = '\0'; 
    fgets(arg2, sizeof(arg2), stdin); 
    arg2[strlen(arg2) - 1] = '\0'; 

    abc: 
    printf("You typed: %s %s\n", arg1, arg2); 
    fflush(stdin); 
    args[0] = arg1; 
    args[1] = arg2; 
    args[2] = '\0'; 

    int i = 0; 
    for (i = 0; i < MAX; i++) { 
     printf("Vlue of arg[%d] =%s\n", i, args[i]); 
    } 

    if (strcmp(args[0], "ls") == 0) { 
     execvp(args[0], args); 
     goto abc; 
    } else 
    if (strcmp(args[0], "ps") == 0) { 

    } 

    printf("Something is not correct...\n"); 
    exit(0); 
} 

이 코드를 ls 명령과 함께 실행하면 이것이 결과입니다. 나는이 코드의 문제점이 무엇인지 모른다. 이 코드를 실행하여 다른 .c 파일을 실행하면 완벽하게 실행되지만 ls 또는 ps 명령을 사용하려고하면 오류가 발생합니다.ls 명령은 C (쉘 스크립트)로 작성된 프로그램에서 작동하지 않습니다.

goto이이 프로그램에서 작동하지 않는 이유가 하나 더 있습니다.

ubos>ls 

You typed: ls 
Vlue of arg[0] =ls 
Vlue of arg[1] = 
Vlue of arg[2] =(null) 
ls: cannot access : No such file or directory 

그래서 여기 내 실수이고 당신은 나에게 간부에게 명령과 다른 종류를 사용하는 방법에 대한 몇 가지 조언을 줄 수 있습니다.

+0

이 출력은 당신에게 단서를주지 않습니다 :'Vlue of arg [1] ='? 'ls'에 빈 문자열을 매개 변수로 제공하고 있습니다. 즉, 당신은'ls '''을 뛰고 있습니다. 해당 명령을 수동으로 실행하면 동일한 결과가 표시됩니다. 두 개의 인수를 하드 코딩해서는 안됩니다. – kaylum

+0

두 단어 인수를 실행하려면 어떻게해야합니까? 또한 일부 .c 파일을 실행하려고합니다. 그래서 두 가지 주장이 있습니다. –

+0

하지만 그건 당신이 테스트하는 것이 아닙니다. 'ubos> ls'. 'ls' 명령에 대한 주장은 없습니다. 따라서 쉘은 0 개의 인수 (한 단어)를 처리해야합니다. 그리고 두 번째 arg를 맹목적으로 빈 문자열 (args [1] = arg2;)로 설정하면됩니다. – kaylum

답변

0

인수를 제공하지 않으면 해당 인수를 args에서 0으로 설정하십시오. 그런 다음 ls은 첫 번째 인수로 빈 문자열을받지 못하므로 전혀 인수를 얻지 못합니다.

args[0] = arg1; 
if (strlen(arg2) == 0) { 
    args[1] = 0; 
} else { 
    args[1] = arg2; 
    args[2] = 0; 
} 

또한 루프에서 모든 인수를 인쇄하는지 확인해야합니다.

for(i=0;i<MAX && arg[i];i++) 
{ 
    printf("Value of arg[%d] =%s\n",i, args[i]); 
} 
+0

내가 ls를 인수로 입력했을 때 세그먼트 분할 falult를 보여줍니다. –

+0

각 인수의 값을 인쇄하는 루프가 끝날 때 중지해야합니다. – Barmar

+0

감사합니다.if (strlen (arg2) == '0') \t { \t \t args [0] = arg1; \t \t args [1] = '\ 0'; 다른 \t} \t \t \t \t { 인수 [0] = ARG1; \t \t args [1] = arg2; \t \t args [2] = 0; \t} –

-1
if (strlen(arg2) == '\0') 
    { 
     args[0] = arg1; 
     args[1] = '\0'; 
    } 
    else 
    { 
     args[0] = arg1; 
      args[1] = arg2; 
      args[2] = 0; 
    } 
for(i=0;i<MAX && args[i];i++) 
    { 
      printf("Vlue of args[%d] =%s\n",i, args[i]); 
    } 

나는 두 번째 인수로 빈 공간을 통과했다. 그래서 그것은 나에게 오류를 보여 주었다. 위의 코드는 내 문제의 해결책입니다 ..

관련 문제