2016-12-17 2 views
-1

이상한 문제가 있습니다. 숙제의 경우 기본 bash 스크립트를 작성하고 있지만 execv()를 실행하여 cp 명령을 실행하면 작동하지 않습니다. ls 및 그룹과 작동하지만 cp는 작동하지 않습니다. 나는 오류를 분리하기 위해 나의 cp 프로그램을 엉망으로 만들었다. 실제로 그것은 execv 명령이다.execv()가 제대로 작동하지 않습니다.

void ls(char** array) 
{ 
     pid_t pid = fork(); 
     if (pid == 0) 
     { 
       execv("./ls",array); 
     } 
     else 
     {  
       waitpid(pid,0,0); 
     } 

} 

void cp(char** array) 
{ 
     pid_t pid = fork(); 
     if (pid == 0) 
     { 
       execv("./cp",array); 
     } 
     else 
     { 
       waitpid(pid,0,0); 
     } 
} 

void groups(char** array) 
{ 
     pid_t pid = fork(); 
     if (pid == 0) 
     { 
       execv("./groups",array); 
     } 
     else 
     { 
       waitpid(pid,0,0); 
     } 
} 

int input() 
{ 
     char buffer[128]; 
     char * str; 
     char * str1; 
     char * str2; 
     char * str3; 
     char *name; 
     int i = 0; 
     int num; 
     int words = 1; 
     name = getlogin(); 
     printf("%s --->", name); 
     int result = scanf("%[^\n]",buffer); 
     getchar(); 
     char **array; 
     if (result > 0) 
     { 
       for (int i = 0; buffer[i]!='\0'; i++) 
       { 
         if (buffer[i] == ' ' || buffer[i] == '\n' || buffer[i] == '\t') 
         { 
           words++; 
         } 
       } 

       array = malloc(words * sizeof(char*)); 
       array[0] = strtok(buffer, " "); 
       for(int w = 1; w < words; w++) 
       { 
         array[w] = strtok(NULL, " "); 
       } 
       if (words == 1) 
       { 
         array[1] = '\0'; 
       } 

     } 
     str = strstr(array[0], "ls"); 
     str1 = strstr(array[0], "cp"); 
     str2 = strstr(array[0], "groups"); 
     str3 = strstr(array[0], "exit"); 
     if (str != NULL) 
     { 
       ls(array); 
       free(array); 
     } 
     else if (str1 != NULL) 
{ 
       cp(array); 
       free(array); 
     } 
     else if (str2 != NULL) 
     { 
       groups(array); 
       free(array); 
     } 
     else if (str3 != NULL) 
     { 
       num = 0; 
       free(array); 
       return num; 
     } 
     else 
     { 
       printf("Incorrect command\n"); 
     } 
     num = 1; 
     return num; 

나는이 스 니펫이 좋을 것이라고 생각합니다. 내 코드가 execv에 올바르게 도착한다. 어떤 이유로 든 실행되지 않는다. ls 및 그룹은 잘 작동하지만 cp는 작동하지 않습니다. 내 기본 그냥 입력을 호출

+2

당신이 오류 검사, 일부 디버그 출력을 추가하는 시도 해 봤나? 'array'에는 무엇이 있습니까? '효과가 없다'는 것은 무엇을 의미합니까? – pvg

+0

'cp'가 현재 작업 디렉토리에 있는지 확인했습니다. –

+0

예, cp가 올바른 디렉토리에 있습니다. 작동하지 않는 것은 cp 명령이 호출 될 때 아무 것도 출력하지 않는다는 것을 의미합니다. 기본적으로 사용자는 cp [file] [destination]을 입력 할 것입니다. 입력 할 때 아무 것도하지 않습니다. execv가 -1을 반환하면 제대로 실행되지 않았 음을 나타냅니다. –

답변

3

제한된 정보를 기반으로 내 생각에 매개 변수로 보낸 배열은 cp 보낼 두 가지 중 하나가 포함되어 있습니다. execv을 호출하기 전에 배열을 인쇄하여 소스와 대상을 모두 cp으로 전송했는지 확인하십시오. 또한 배열 마지막 요소가 널 포인터 인지도 확인하십시오.

+0

소스 및 대상이 올바르게 표시됩니다. 나는 또한 나의 cp 프로그램에 들어가서 첫 줄에 문장을 인쇄 해줬고 그렇게하지 않았다. –

+1

널 포인터가 배열의 마지막 요소인지 확인하십시오. –

+0

글쎄, 흥미 롭다. 그렇게 할 때 세그먼트 화 오류가 발생한다. –

2

이 나를 위해 작동합니다

char* args[] = { "/bin/cp", "/etc/passwd", "passwd-copy", 0 }; 
pid_t pid; 
if(0>(pid=fork())){ 
    perror(0); 
    return -1; 
} 
if(0==pid){ 
    execv(args[0], args); 
    perror(0); 
    _exit(127); 
} 
siginfo_t info; 
if(0>waitid(P_PID, pid, &info, WEXITED)){ 
    perror(0); 
    return -1; 
} 
return info.si_status; 
+0

은 NULL이 아닙니다 (C의 암시 적 변환 기능이 프로그램을 저장할 수도 있음). 'perror()'함수는 포인터가 정수가 아니라 매개 변수로 간주합니다. 배열 'args {}'는 마지막 항목을 0이 아닌 NULL로 설정해야합니다. – user3629249

+0

@ user3629249 실제로'0'은'NULL' 매크로의 표준 준수 값이며'(void *) 0'입니다. 때로는'execlp ("foo", "foo", "bar", (char *) 0);와 같은 캐스트가 필요하지만 위의 컨텍스트 중 어느 것과도 일치하지 않습니다 ('stdio.h '가 포함되어 있으면 'perror'의 프로토 타입이 함께 제공됩니다.) – PSkocik

+0

@ user3629249'perror (0)'은 sem을'perror ("")'로 사용한다. 접두사는없고, 콜론은없고, 단지 문자열 화 된'errno'이다. 나는'perror'에서 널 포인터를 허용하는 것이 나쁜 설계 (전체'perror' 함수가 그렇듯이)라고 생각하지만, 사용 가능하고 사람들이 그것을 사용하기 때문에 나도 마찬가지라고 생각합니다. – PSkocik

관련 문제