2012-09-10 6 views
-1

기본적으로 특정 파일의 존재 여부를 확인하려고합니다. 그 때문에 나는 유닉스의 테스트 명령을 사용하고있다.C 프로그램의 linux 명령에서 리턴 코드 받기

sprintf(execbuf, "%s if test -r %s ; then true; else exit; fi;", 
     execbuf, st->file, NO_FILE); 

잘 작동하지만 파일이 여기에 없으면 종료하지 않고 대신 FAIL을 반환해야합니다.

프로그램이 FAIL을 반환하는 방법을 알아낼 수 없습니다. 위의 명령에서 종료 코드를 사용하려고 생각했지만 여전히 프로그램의 Linux 명령 외부에서 종료 코드를 사용하는 방법을 파악할 수 없습니다.

+5

'stat()'함수를 사용하는 것이 훨씬 쉽지 않을까요? 또는'access()'? – rodrigo

+0

내 제안 된 솔루션에 대한 귀하의 의견을 바탕으로, C 코드를 통해 쉘 스크립팅을 실행하려고 시도하고 그 결과를 확인하겠습니까? – Mike

+0

언제'sprintf()'가 프로그램을 실행할 수있는 능력을 얻었습니까? – quantum

답변

4

access() 호출을 사용하고 외부 쉘 명령을 실행하지 않는 것이 좋습니다.

이러한 경우는 경쟁 조건이 있습니다. access()를 호출하거나 파일이 있는지 여부를 결정하는 셸 명령을 실행하면 파일이 존재할 수 있지만 실제로 필요할 때 사라질 수 있습니다. 나중에. 그게 문제인 경우, 파일을 열어() 나중에 I/O가 필요할 때 파일 설명자를 사용하십시오.

1

당신이 지금 뭘 결혼하지 않는 경우, 그때 통계를 사용하는 것이 좋습니다 것 :이 존재 아닌지

#include <sys/stat.h> 
#include <stdio.h> 

int main (int argc, char** argv[]) 
{ 
    struct stat sts; 
    if (stat(argv[1], &sts) == -1 && errno == ENOENT) 
     printf ("The file %s doesn't exist...\n", argv [1]); 
    else 
     printf("The file exists\n"); 

이 당신을 말할 것이다. '명령 행을 전달하고 싶지 않으면 매개 변수 1은 const char *이므로 파일 이름을 전달하십시오.

+0

stat의 문제는 절대 경로를 전달해야한다는 것입니다. 그러나 $ HOME/file.sh를 수행하는 경우 stat가 -1을 반환합니다. –

+0

절대 경로를 전혀 전달할 필요가 없습니다. '~/file.txt' 같은 것들도 작동합니다. – Mike

+0

'stat' 호출은 상대 경로가 절대 경로를 필요로하지 않습니다. 그러나 유효한 경로가 필요합니다 - 물결표 나 변수 확장을하지 않으므로'$ HOME/foo' 나'~/foo' 어느 것도 작동하지 않습니다. – user4815162342

관련 문제