2013-10-21 2 views
0

문제를 설명하려고합니다. 내가 리눅스에서 다음 명령을execlp와 매개 변수로 찾기

find ~ -name file.txt 

을 실행하면, file.txt 명명 된 모든 파일은 콘솔 화면에 표시됩니다. 나는 execlp 함수를 사용하여 file.txt과 같은 특정 이름을 가진 모든 파일을 찾는 동일한 작업을 수행하는 C 프로그램을 만들고 싶습니다.

나는 같은 것을 할 경우는 잘 컴파일하지만 실행에 그것은 단지 현재 작업 디렉토리에있는 이름 file.txt으로 파일을 표시

execlp("find","find","-name","file.txt",NULL); 

. 난 내 프로그램에서 같은 것을 할 경우 :

execlp("find","find","~","-name","file.txt"); 

그것을 잘 컴파일하지만 실행에 그것은 나에게 다음과 같은 오류 제공 :

find: `~': No such file or directory. 

것은 내가 execlp 기능을 제공해야합니다 어떤 매개 변수 검색을 사용 가능한 모든 디렉토리에서 file.txt을 찾으십니까? 나는 execlp 함수로 이것을 할 필요가있다. 대단히 감사합니다!

+2

쉘이 cmd 행에서'~'를 확장하고 있지만'execlp' 호출에서 확장하지 않습니다. 전체 경로를 사용하거나 실제로 존재하는 디렉토리 요소를 지정하십시오 ('.'은 마음에 떠오 릅니다). – WhozCraig

+0

이 프로그램은 다른 사용자 계정에서 작동해야합니다. 예를 들어, 내 친구가 자신의 계정에서이 프로그램을 실행하고 있다면, 파일 시스템에 존재하는 "file.txt"라는 이름의 모든 파일을 가져와야합니다. 사용자는 다른 사용자의 파일에 대한 액세스 권한이 없습니다. – Zan

답변

1

첫 번째 예제의 "~"는 커널이 아닌 셸에 의해 확장됩니다. C에서 명령을 실행할 때 셸을 통과하지 않으므로 이러한 대체가 발생할 수 있습니다. 자, 실제로 쉘을 호출하고 명령을 실행하도록 요청하지 않으면 (execlp("/bin/sh", "/bin/sh", "-c", "find", "~", ...);에서와 같이).

현재 수행중인 작업을 수행하는 가장 좋은 방법은 HOME 환경 변수를 확인하거나 암호 데이터베이스에서 현재 사용자의 홈 디렉토리를 얻는 것입니다. 방법은 다음과 같습니다.

#include <unistd.h> 
#include <sys/types.h> 
#include <pwd.h> 
#include <stdlib.h> 

const char *homedir = getenv("HOME"); 
if (homedir == NULL) { 
    struct passwd *pw = getpwuid(getuid()); 
    homedir = pw->pw_dir; 
} 

다음 코드에서 "~"인수를 homedir 변수로 바꾸십시오.

+0

고마워,이 잘 작동합니다. 그리고 모두 도와 주셔서 감사합니다. – Zan

+0

getpwuid의 매뉴얼 페이지 권장 사항에 따라 HOME 환경 변수를 먼저 확인하도록 코드를 업데이트했습니다. 이것이 bash의 "~"가하는 일입니다. 이것은 사용자가 자신의 홈 디렉토리를 다시 정의 할 수 있도록하기 위해 수행됩니다. 그러나 권한있는 대답이 필요한 경우 HOME 환경 변수에 의존하는 것이 좋지 않을 수 있습니다 (즉, 사용자가 자신의 홈 디렉토리를 변경할 수 있도록 허용하면 보안 문제가 발생할 수 있음). – jwatkins

관련 문제