execve / bin / bash:h:没有这样的文件或目录

时间:2012-10-31 11:59:01

标签: c++ unix exec rhel5

在几个RHEL 5.8上,我遇到了execve调用的问题。然而,execve没有失败,得到以下错误:

/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脚本是我试图执行的。 此外,此处writefdreadfdchar*。在我粘贴的strace输出中可以清楚地看到它。再次,exec没有在这里失败,因为我没有看到“无法启动Launcher.sh”消息。

2 个答案:

答案 0 :(得分:1)

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

使一些脚本通过管道与程序通信的最简单方法是将dup2一个管道的读取端连接到标准输入,并将dup2另一个管道的写入端连接到标准输出之前致电execl。该脚本只是从标准输入读取并写入标准输出。您根本不需要将这些文件描述符传递给脚本。

答案 1 :(得分:0)

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

这不会起作用...... <script.sh>无效C ++。

将其更改为:

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