2012-10-31 23 views
-1

在几个RHEL 5.8上,我遇到了execve调用的问题。该execve的不但是失败了,得到以下错误:execve/bin/bash:h:没有这样的文件或目录

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

我使用它在C以下方式++代码:

::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; 
} 

这里的exec调用不会失败,但我上面得到尝试与上述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”在这里被引用,但脚本名的最后一个字符为“H”。另外,我试图执行的脚本确实存在于预期的位置,并且具有足够的权限。

我不知道“h”是从哪里来的。

我改变了我的execve调用以下:

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

有了这个,它工作正常,但向下下面的代码,我看到类似的错误再execl的电话。第二个exec的区别在于二进制文件不同,但错误保持不变。

我不确定,如果这是服务器特定的问题。

任何线索,任何故障排除步骤都会有很大的帮助。

我不好,我早就应该提到它了,<script.sh>是一个占位符。我试图说明一个shell脚本是我正在尝试执行的。 另外,writefdreadfd在这里是char*。在我粘贴在这里的strace输出中可以清楚地看到它。同样,执行官也没有失败,因为我没有看到“无法启动Launcher.sh”消息。

+0

由于您隐藏了所有重要的信息 - 这就是您的伪值“” - 对我们来说,无法提供太多帮助。在执行exec之前,应该打印这些值。当你得到有趣的结果时,打印出值。有可能,'strace'说的是实话,而shell正在被要求执行一个它找不到的脚本'h'。你的'switch(errno)case default:printf(“...”);'code is cizarre;有效(有点)但奇怪。如果'execl()'返回,则失败。你不需要测试任何东西;只需报告错误(到“stderr”或“cerr”)。 –

+0

@Jonathan,对于这些信息,我在其他RHEL服务器上提到的exec调用完全正常。只有几个RHEL在同一件事情上失败。我编辑了我的帖子以指示值。我已经从实际文章中发布了示例。 – user1787572

+0

我的意思是在之前的评论中没有发布实际的代码相信我,我已经完成了练习,以确定传递给exec调用的值是否正确,以及脚本的权限和位置等所有基本事项是否正确。它是确定特定RHEL服务器上出现错误的问题。对于您的信息,是Launcher.sh。还纠正了开关(errno)中的语法错误。发布这个问题时就是这么想的。让我知道,如果我错过了从故障排除的角度来看很重要的任何信息,我会提供它。 – user1787572

回答

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

这只是不会工作... <script.sh>是无效的C++。

将其更改为:

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

请参阅我已添加的最后一段,以便在我原来的帖子中提及。 – user1787572

1

有除了由MikeyB解决的<script.sh> VS "script.sh"问题这里的另一个问题。另一个问题是writefdreadfd被传递给execl。鉴于名称,我假设这些是一个管道的写入结束和另一个管道的读取结束。如果是这种情况,writefdreadfd是整数,而不是char*指针。

以使一些脚本通过管道与程序通信最简单的方法是dup2一个管道标准输入和dup2其他管道标准输出调用execl之前写端的读端。该脚本只是从标准输入读取并写入标准输出。您不需要将这些文件描述符完全传递给脚本。

+0

请参阅我已添加的最后一段,以便在我原来的帖子中提及。 – user1787572

相关问题