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하려고하는 것임을 나타 내기 위해 노력했다. 또한 writefd
및 readfd
은 여기에서 char*
입니다. 여기에 붙여 넣은 strace 출력에서 명확하게 볼 수 있습니다. 다시 말하지만, "Launcher.sh 실행 실패"메시지가 표시되지 않으므로 exec가 여기에서 실패하지 않습니다.
귀하가 의사 값 ''과 같은 중요한 정보를 숨기고 있기 때문에 많은 도움을받을 수 없습니다.exec을 수행하기 전에 값을 인쇄해야합니다. 재미있는 결과를 얻으려면 값을 인쇄하십시오. 기회는'strace'가 진실을 말하면서 쉘은 찾을 수없는 스크립트'h'를 실행하도록 요청 받고 있습니다. 당신의'switch (errno) case default : printf ("...");'코드는 기괴하다; 유효한 (종류의) 그러나 기괴한. 'execl()'이 리턴하면 실패합니다. 아무것도 테스트 할 필요가 없습니다. (stderr 또는'cerr'에) 오류를보고하십시오. –
@Jonathan, 정보에 대해서는 다른 RHEL 서버에서도 완벽하게 언급 한 임원 호출입니다. 같은 일이 실패하는 RHEL의 부부 만 있습니다. 내 게시물을 편집하여 값을 나타냅니다. 나는 실제 게시물에서 예제를 게시했습니다. – user1787572
나는 실제 코드가 이전 코멘트에 게시되지 않는다는 것을 믿는다. 나는 exec 호출에 전달되는 값이 정확하고 스크립트의 권한 및 위치와 같은 모든 기본 사항이 올바른지 알아 내기 위해 이미 연습을했다. 특정 RHEL 서버에서 발생하는 문제를 확인하는 문제입니다. 자세한 내용은이 Launcher.sh입니다. 또한 switch (errno)에서 구문 오류를 수정했습니다. 이것은 질문을 게시하는 동안 내가 생각하는 전부입니다. 문제 해결의 관점에서 중요한 정보를 놓친 경우 알려 주시면 제공해 드리겠습니다. –
user1787572