여러 경로가 포함 된 배열을보고 (예 : ls, wc, cat ... 등) 명령이 나열된 디렉토리에 있는지 확인하는 알고리즘이 있습니다. 배열 파일이 디렉토리 중 하나에서 발견되면 전체 디렉토리 경로를 리턴합니다.파일이있는 경우 디렉토리 배열 검색
char *LookupPath(char **argv, char **dir)
{
/* String Name To Be Returned */
char *result;
char path_name[MAX_PATH_LEN] = {0};
int i;
/* Check To See If File Name Is Already An Absolute Path Name */
if(*argv[0] == '/') {
}
/* Look In Path Directories */
for(i = 0; dir[i] != NULL; i++) {
strncat(path_name, dir[i], sizeof(path_name));
strncat(path_name, "/", sizeof(path_name));
strncat(path_name, argv[0], sizeof(path_name));
printf("pathname: %s\n", path_name);
result = path_name;
if(access(result, F_OK) == 0) {
printf("SUCCESS!\n");
printf("result: %s\n", result);
return result;
}
path_name[0] = '\0';
}
/* File Name Not Found In Any Path Variable */
return NULL;
}
새로운 문제 : 같은 -l LS 또는 다른 것으로 명령을 사용하는 경우 아래의 결과 코드와 같이 결과가 아름답게 작동합니다.
pathname: /usr/lib/lightdm/lightdm/ls
pathname: /usr/local/sbin/ls
pathname: /usr/local/bin/ls
pathname: /usr/sbin/ls
pathname: /usr/bin/ls
pathname: /sbin/ls
pathname: /bin/ls
SUCCESS!
result: /bin/ls
, 지금은 그런 어떤 이유로, 새로운 라인 문자가 LS에 추가되기 때문에 결과는 ... 거짓에 ...의에 'LS'로 단순한 명령을 사용할 때 ...? 나타납니다
pathname: /usr/lib/lightdm/lightdm/ls
pathname: /usr/local/sbin/ls
pathname: /usr/local/bin/ls
pathname: /usr/sbin/ls
pathname: /usr/bin/ls
pathname: /sbin/ls
pathname: /bin/ls
pathname: /usr/games/ls
pathname: /usr/local/games/ls
ls
: Command Not Found!
나는 이유를 알고하지 않습니다. 그것을 'ls'로 줄이는 방법이 있습니까? argv [0]에 새로운 라인 문자가 추가되는 이유를 모르겠다. 그냥 간단한 ls 명령 일 뿐이다. : S
는 strcat와는 (이명 령, SRC) ... 그리고 나는 나에게 이명 령으로 사용 표시되지 않습니다. 그렇다면 적절한 코드는 무엇입니까? : S –
당신은 "result = dir [i];" 다음 "strcat (결과,"/ ");" 결과는 dir [i]와 같습니다. dir [i]가 가리키는 문자열을 수정하고 있습니다. –
좋아요, 이제 배열에 문자가 있습니다. char_name [MAX_SIZE]; 어떻게 구성할까요? : S ... snprintf 사용 ... dir [i]/argv [0] ...을 사용하고 싶습니다 ... –