2017-12-26 36 views
0

find 명령의 경로를 테스트로 사용하여 execl (...)을 호출하는 간단한 테스트 프로그램을 작성했습니다. find 프로그램에 전송 된 매개 변수와 상관없이 stdout에는 출력이 없습니다. 왜 이런 일이 일어나는 걸까요? 프로그램은 다음과 같습니다.find-utils의 find 프로그램에서 execl (...)이 결과를 출력하지 않는 이유는 무엇입니까?

#include <unistd.h> 
#include <sys/types.h> 
#include <cstdio> 
#include <cerrno> 


int main(int argc, char** argv) 
{ 
    if(execl("/usr/bin/find", "/usr/bin/find", "/", "-maxdepth", "1", "-name", "bin", (char*)NULL) == -1) 
    { 
     perror("In QueryRequest::Client_Execute(): "); 
     _exit(1); 
    } 

    return 0; 
} 

위의 프로그램의 컴파일 및 실행 테스트는 다음과 같습니다. 그것으로부터 출력이 없다는 것에주의하십시오. 위의 매개 변수를 사용하여 콘솔에서 find를 실행하면 비어 있지 않은 출력이 생성됩니다. 여기서 문제는 무엇이며 어떻게 지나갈 수 있습니까?

[[email protected] src]$ g++ test.cpp -o test 
[[email protected] src]$ ./test 
[[email protected] src]$ 

대상 시스템에 대한 특정 메타 정보 :

Linux 4.9.66-1-MANJARO #1 SMP PREEMPT Thu Nov 30 14:08:24 UTC 2017 

결과를 변경하지 않는 것을 발견 할 수 -print 인수를 사용. 이 동작은 4.11 커널을 사용하는 4.9.66-1-MANJARO 및 다른 ARCH 기반 독점 배포판을 포함하여 다른 시스템에서 예상대로 작동합니다. g ++ 7.2 및 다른 4.x 버전으로 컴파일했습니다.

+1

나를 위해 작동합니다. –

+0

나를 위해 일한다. – Anon

+0

Q를 편집하여'uname -srv'의 결과를 보여줍니다. 행운을 빕니다. – shellter

답변

0

신중 execl(3)의 문서를 읽고 (execl에 의해 호출되는)을 execve(2) 시스템 호출의.

execlexecve은 실패시에만 반환됩니다. 성공하면 호출 프로세스가 완전히 virtual address space을 변경하여 새 executable을 실행하므로 반환하지 않습니다.

문제를 디버깅하려면 /usr/bin/find/bin/echo으로 일시적으로 대체하거나 strace(1) (예 : strace(1))을 일시적으로 바꿀 수 있습니다. strace ./test. 프로그램 이름으로 test를 사용 BTW

는, 그래서 난 강력하게, 예를 들어, 다른 이름을 사용하는 것이 좋습니다 .... 표준 test(1) (예를 들어, bash test builtin)와 충돌하기 때문에, 가난한 맛입니다 mytest ....

물론 find(1) 설명서를주의 깊게 읽으십시오.

BTW, 내 데비안 시스템에 (curious로 이름) 프로그램이 작동하고 출력이 nftw(3)를 사용하여 C 프로그램에서 find 프로세스를 실행 피할 수 /bin

공지 사항.

또한 C와 C++는 다른 언어이므로 (코드는 C와 비슷하지만 #include <stdio.h>#include <errno.h>이어야 함) 기억하십시오. 모든 경고 및 디버그 정보를 사용하여 컴파일하는 것을 잊지 마십시오. GCC의 경우 with-Wall -Wextra -g입니다. use the debugger gdb에 대해 자세히 알아보십시오.

0

게시 된 코드가 C 컴파일러와 함께 컴파일되지 않습니다.

다음 코드를 사용하는 것이 좋습니다 :

#include <unistd.h> // execl(), _exit() 
#include <stdio.h> // perror() 

int main(void) 
{ 
    execl("/usr/bin/find", "/usr/bin/find", "/", "-maxdepth", "1", "-name", "bin", NULL); 
    perror("In QueryRequest::Client_Execute(): "); 
    _exit(1); 
}