首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用execv从C++代码执行Linux脚本失败

使用execv从C++代码执行Linux脚本失败
EN

Stack Overflow用户
提问于 2020-01-06 20:23:55
回答 2查看 163关注 0票数 2

我有一个非常基本的Linux脚本(/home/scripts/script.sh):

代码语言:javascript
复制
#!/bin/bash
echo 'a' | /bin/netcat -vv 10.10.10.1 3333
echo "done" > /tmp/result

当我尝试从shell运行它时,它工作得很好。因此,脚本是好的(同时, So 被写到/tmp/文件中):

代码语言:javascript
复制
# /home/scripts/script.sh
10.10.10.1: inverse host lookup failed: Unknown host
(UNKNOWN) [10.10.10.1] 3333 (?) open
AABBCCDDEEF
 sent 2, rcvd 13
#

但是,当我试图从前台守护进程中的C++代码中运行它时:

代码语言:javascript
复制
const char **argv = new const char* [3];
argv[0] = "/home/scripts/script.sh";
argv[1] = "/home/scripts/script.sh";
argv[2] = NULL;
execv(argv[0], const_cast<char**>(&argv[1]));

在短时间内,它工作良好(3-5分钟)。在短时间内运行脚本失败后,nc的返回代码为1,这是输出:

代码语言:javascript
复制
10.10.10.1: inverse host lookup failed: Unknown host
(UNKNOWN) [10.10.10.1] 3333 (?) open
Preposterous fd value 17
 sent 0, rcvd 0

为什么fd值是荒谬的?我的守护进程在最初的3-5分钟内打开了一些文件,也许netcat无法像fd那样处理更多的文件?

我该如何克服这个问题?

EN

回答 2

Stack Overflow用户

发布于 2020-01-06 22:17:49

这个问题是由网猫引起的。

首先,我没有意识到这一信息的重要性:

代码语言:javascript
复制
Preposterous fd value 17

这实际上是netcat的一个非常重要的错误消息,因为它在默认情况下不能与高于16的fds一起工作,这对于简单的脚本来说是完全可以接受的。

然而,在多线程环境中,当netcat被调用时,可能已经使用了16多个fds。

是2007年的消息,它将16到1024升级为错误修复程序。

Netcat的官方网页是https://nc110.sourceforge.io,目前的版本是1.10,它仍然将FD_SETSIZE定义为16。

解决方案是抓取代码,修补它并构建它。

票数 2
EN

Stack Overflow用户

发布于 2022-05-11 15:23:52

简单回答:在debian中,我解决了安装netcat-openbsd.的问题默认的netcat指的是传统的netcat,它仍然存在这个bug。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59618474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档