이 프로그램을 사용하여 명령 줄 인수를 통해 주어진 셸 명령을 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;
}
출력 결과는 어떻게됩니까? 명령이 실패 했습니까? – Arpit
'명령 행 인수로 작업하고 있지 않다 '고 말하면'execvp'가 추가 인수없이 성공적으로 완료되었다는 것을 의미합니까? 또한'PATH'에 대해서 언급 했으므로 완전한 경로로 명령을 주려고 했습니까? –
arglist에 명령 이름을 복사하고있는 것 같습니다. 아마도 실패 이유입니다. – Arpit