2012-10-31 5 views
-1

RHEL 5.8에서 execve 호출에 문제가 있습니다. 가 execve는 다음과 같은 오류지고, 그러나 실패하지 않는 : 나는 C에서 그것을 다음과 같은 방법을 사용하고execve/bin/bash : h : 해당 파일이나 디렉토리가 없습니다.

/bin/bash: h: No such file or directory 

를 ++ 코드 :

::fork(); 
. 
. 
. 
char achWritePipeDescriptor[8], achReadPipeDescriptor[8]; 
snprintf(achWritePipeDescriptor, sizeof(achWritePipeDescriptor), "%d", fWritePipeDescriptor); 
    snprintf(achReadPipeDescriptor, sizeof(achReadPipeDescriptor), "%d", fReadPipeDescriptor); 

// fWritePipeDescriptor and fReadPipeDescriptor are integers 

::execl("/bin/sh", "/bin/sh", "Launcher.sh", achWritePipeDescriptor, achReadPipeDescriptor, (char*)0); 

switch(errno) 
{ 
default: 
    printf("\n Failed to launch Launcher.sh\n"); 
    break; 
} 

여기 간부 호출이 실패하는 것이 아니라, 내가 위에서 얻고 있었다 위의 script.sh와 상호 작용할 때 오류가 발생했습니다. 이 과정에 대한 strace를 출력은 다음과 같습니다 :

execve("/bin/bash", ["/bin/bash", "h", "10", "6"], [/* 36 vars */]) = 0 
. 
. 
. 
open("/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 
fstat(2, 0x7fff23708910)    = -1 EBADF (Bad file descriptor) 
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b9d1c785000 
write(2, "/bin/bash: h: No such file or di"..., 40) = -1 EBADF (Bad file descriptor) 
exit_group(127)       = ? 
Process 13030 detached 

여기에 참조되는 어떤 파일 "시간"이 없지만, 스크립트 이름의 마지막 문자는 "시간"입니다. 또한, 나는 임원하려고하는 스크립트가 예상 위치에 존재하고 충분한 권한이 있습니다.

나는 "h"가 오는 곳으로부터 단서가 없습니다.

이와
::execl("Launcher.sh", "Launcher.sh", achWritePipeDescriptor, achReadPipeDescriptor,(char*)0); 

이 제대로 작동했지만 아래 코드 아래, 나는 또 다른 execl 함수 호출에 대해 유사한 오류가 표시 오전 :

나는 다음에 내에서 execve 전화를 변경했습니다. 두 번째 임원의 차이점은 바이너리가 다르지만 오류는 동일하게 유지된다는 것입니다.

서버 관련 문제인 경우 잘 모르겠습니다.

모든 단서, 문제 해결 단계가 큰 도움이 될 것입니다.

내가 잘못 생각하면 이전에 언급 했어야했는데 <script.sh>은 자리 표시 자입니다. 나는 셸 스크립트가 내가 exec하려고하는 것임을 나타 내기 위해 노력했다. 또한 writefdreadfd은 여기에서 char*입니다. 여기에 붙여 넣은 strace 출력에서 ​​명확하게 볼 수 있습니다. 다시 말하지만, "Launcher.sh 실행 실패"메시지가 표시되지 않으므로 exec가 여기에서 실패하지 않습니다.

+0

귀하가 의사 값 ''과 같은 중요한 정보를 숨기고 있기 때문에 많은 도움을받을 수 없습니다.exec을 수행하기 전에 값을 인쇄해야합니다. 재미있는 결과를 얻으려면 값을 인쇄하십시오. 기회는'strace'가 진실을 말하면서 쉘은 찾을 수없는 스크립트'h'를 실행하도록 요청 받고 있습니다. 당신의'switch (errno) case default : printf ("...");'코드는 기괴하다; 유효한 (종류의) 그러나 기괴한. 'execl()'이 리턴하면 실패합니다. 아무것도 테스트 할 필요가 없습니다. (stderr 또는'cerr'에) 오류를보고하십시오. –

+0

@Jonathan, 정보에 대해서는 다른 RHEL 서버에서도 완벽하게 언급 한 임원 호출입니다. 같은 일이 실패하는 RHEL의 부부 만 있습니다. 내 게시물을 편집하여 값을 나타냅니다. 나는 실제 게시물에서 예제를 게시했습니다. – user1787572

+0

나는 실제 코드가 이전 코멘트에 게시되지 않는다는 것을 믿는다. 나는 exec 호출에 전달되는 값이 정확하고 스크립트의 권한 및 위치와 같은 모든 기본 사항이 올바른지 알아 내기 위해 이미 연습을했다. 특정 RHEL 서버에서 발생하는 문제를 확인하는 문제입니다. 자세한 내용은 이 Launcher.sh입니다. 또한 switch (errno)에서 구문 오류를 수정했습니다. 이것은 질문을 게시하는 동안 내가 생각하는 전부입니다. 문제 해결의 관점에서 중요한 정보를 놓친 경우 알려 주시면 제공해 드리겠습니다. – user1787572

답변

0
execl("/bin/sh", "/bin/sh", <script.sh>, writefd, readfd, NULL); 

그저 작동하지 않을 것입니다 ... <script.sh>은 (는) C++가 유효하지 않습니다. MikeyB에서 해결하는 <script.sh>"script.sh" 대 문제뿐만 아니라 여기에 또 다른 문제가있다

execl("/bin/sh", "/bin/sh", "script.sh", writefd, readfd, NULL); 
+0

원본 게시물을 참조하기 위해 내가 추가 한 마지막 파라를 참조하십시오. – user1787572

1

: 그것은에

변경합니다. 다른 문제는 writefd이고 readfdexecl으로 전달됩니다. 이름을봤을 때, 나는 그것들이 하나의 파이프의 쓰기 엔드이고 다른 파이프의 읽기 엔드라고 가정하고 있습니다. 이 경우 writefdreadfd은 정수이며 char* 포인터가 아닙니다.

일부 스크립트가 파이프를 통해 프로그램과 통신 만드는 가장 간단한 방법은 dup2에 표준 입력 한 파이프 라인 및 execl 호출하기 전에 표준 출력에 다른 파이프 라인의 dup2 쓰기 끝의 읽기 끝입니다. 이 스크립트는 표준 입력을 읽고 표준 출력에 기록합니다. 스크립트에 파일 설명자를 전혀 전달할 필요가 없습니다.

+0

원래 게시물에서 참조 할 수 있도록 추가 한 마지막 파라를 참조하십시오. – user1787572

관련 문제