execve /bin /bash:h:没有这样的文件或目录
execve /bin/bash: h: No such file or directory
在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.shn");
break;
}
此处的Exec调用并没有失败,但是当尝试与上述脚本交互时,我会超越错误。此过程的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"即将到来。
我将执行呼叫更改为以下:
::execl("Launcher.sh", "Launcher.sh", achWritePipeDescriptor, achReadPipeDescriptor,(char*)0);
这样,它可以正常工作,但是在下面的代码下,我看到另一个Execl调用的类似错误。第二次执行的区别在于二进制是不同的,但是错误仍然相同。
我不确定这是服务器特定问题。
任何线索,任何故障排除步骤都会有很大的帮助。
我的坏人,我应该早些时候提到它,<script.sh>
是占位符。我试图表明我要执行的shell脚本。另外,writefd
和readfd
在这里是char*
。在我在这里粘贴的strace输出中可以清楚地看到。同样,Exec在这里没有失败,因为我没有看到"无法启动启动器"消息。
除了Mikeyb解决的<script.sh>
与"script.sh"
问题外,这里还有另一个问题。其他问题是将writefd
和readfd
传递给execl
。鉴于名称,我假设这些是一个管道的写入末端,也是另一根管道的读取末端。如果是这种情况,writefd
和readfd
是整数,而不是char*
指针。
使一些脚本通过管道与您的程序通信的最简单方法是dup2
一个管道的读取末端到标准输入,而dup2
在调用execl
之前,将另一管线的写入末端到标准输出。该脚本只需从标准输入读取,并写入标准输出。您不需要将这些文件描述符完全传递给脚本。
execl("/bin/sh", "/bin/sh", <script.sh>, writefd, readfd, NULL);
那只是不工作的……<script.sh>
无效C 。
将其更改为:
execl("/bin/sh", "/bin/sh", "script.sh", writefd, readfd, NULL);
- 如何在 bash 中使用管道在 c++ 中使用 getenv() 访问文件?
- -bash:/a.out:无法执行二进制文件:Exec格式错误
- Bash 代码,仅在当前可执行文件完成运行时在循环中运行可执行文件
- 如何处理在 bash 文件中获取运行时输入的 c++ 程序
- 如何使用gnu_parallal以运行多个可执行文件和/或bash脚本
- bash:./main:无法执行二进制文件:Exec格式错误
- 以目录作为参数运行C 文件?而是使用bash
- 如何使用CMakeLists.txt为我的可执行文件设置bash中的环境变量
- 将输入值从BASH脚本传递到C 可执行文件
- 用于使用命令行参数C++的生成文件和 Bash 脚本
- execve /bin /bash:h:没有这样的文件或目录
- 如何使用 bash 将文本文件定向到 C 程序
- 使用[msys]bash删除所有名称与模式匹配的文件,而不考虑文件名字母大小写
- 如何遍历当前目录并将文件存储在数组中?Bash 外壳脚本
- 如何在 bash 文件异常退出时捕获异常
- C++临时文件作为 bash 脚本执行
- bash:即使二进制和Linux是64位的,也无法执行二进制文件:Exec格式错误
- 生成文件:在全局变量初始化之前通过"make all"命令运行 bash 脚本
- 如何从可执行文件打开bash
- BASH脚本编译多个c++文件- OpenCV