2014-08-29 2 views
0

이 프로그램을 사용하여 명령 줄 인수를 통해 주어진 셸 명령을 execvp()fork() 시스템 호출을 사용하여 실행하고 있습니다. 여기서 arglist는 명령 이름과 인수 목록이 들어있는 2D 배열입니다. 첫 번째 인수로 command name을 전달하고 두 번째 인수로 arglist 배열을 전달합니다. 하지만 작동하지 않습니다. man 페이지 execvp()은 PATH 변수에 정의 된 디렉토리에서 기본적으로 주어진 명령을 찾을 것이라고 말합니다. 이것이 바로 명령 이름 만 전달하는 이유입니다.execvp가 명령 줄 인수로 작동하지 않습니다.

#include<stdio.h> 
#include<sys/types.h> 
#include<stdlib.h> 
#include<string.h> 

void executeCommand(char *command,char **arglist){ 

    int pid; 
    int status; 

    pid=fork(); 

    printf("%s %s\n",command,arglist[1]); 

    if(pid == -1){ 
     printf("fork failed\n"); 
     exit(1); 
    } 
    else if(pid==0){ 

     if(execvp(command,arglist) == -1){ 
      printf("execution of command failed\n"); 
      exit(1); 
     } 
     exit(0); 
    } 
    else { 

     while(wait(&status) != pid); 

     printf("Parent Exiting\n"); 
     exit(0); 
    } 


} 


int main(int argc,char **argv){ 

    char **arglist,*com; 
    int i,k=1; 

    if(argc>2){ 
     arglist = (char**)malloc(sizeof(char*)*(argc)); 
     for(i=0;i<argc-1;i++){ 
      arglist[i] = (char*)malloc(sizeof(char)*1024); 

     } 
     com = (char*)malloc(sizeof(char)*strlen(argv[1]));  

     strcpy(com,argv[1]); 
     for(i=1;i<=(argc-1);i++,k++){ 
      strcpy(arglist[k],argv[i]); 

     } 
     arglist[k] = NULL ; 
     for(i=0;i<argc;i++){ 
      printf("%s\n",argv[i]); 
     } 

     executeCommand(argv[1],arglist); 



    } 

    //printf("%d\n",argc); 




    return 0; 
} 
+0

출력 결과는 어떻게됩니까? 명령이 실패 했습니까? – Arpit

+0

'명령 행 인수로 작업하고 있지 않다 '고 말하면'execvp'가 추가 인수없이 성공적으로 완료되었다는 것을 의미합니까? 또한'PATH'에 대해서 언급 했으므로 완전한 경로로 명령을 주려고 했습니까? –

+0

arglist에 명령 이름을 복사하고있는 것 같습니다. 아마도 실패 이유입니다. – Arpit

답변

0
당신은 당신이 터미네이터위한 공간을하지 않기 때문에

com = (char*)malloc(sizeof(char)*strlen(argv[1])); 

, 당신은 나 strlen 등

에서의 결과에 하나를 추가해야 할 명령에 충분한 공간을 할당하지 않습니다

com = (char*)malloc(sizeof(char)*(1+strlen(argv[1]))); 

malloc/strcpy 대신 strdup을 사용하는 것이 더 쉽습니다. 그럼 그냥

com = strdup(argv[1]); 

arglist[k] = strdup(argv[i]); 

말과 아글리스트 자체를위한 공간을 만드는 일을 제외하고 mallocs을 모두 제거해야합니다.

+0

또한 C로 malloc 반송 주소를 캐스팅하지 않아도됩니다. – knarf