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

问题描述 投票:0回答:1

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

#!/bin/bash
echo 'a' | /bin/netcat -vv 10.10.10.1 3333
echo "done" > /tmp/result

当我尝试从外壳运行它时,它工作正常。因此脚本很好(而且done也已写入/ tmp / result文件中):

# /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 ++代码运行它时:

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,这是输出:

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处理?

如何克服这个问题?

c++ linux file-descriptor netcat
1个回答
0
投票

此问题是由netcat引起的。

首先,我没有意识到此消息的重要性:

Preposterous fd value 17

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

但是在多线程环境中,当调用netcat时,已经使用了超过16个fds。

This是来自2007年的消息,该消息将16更新为1024,作为错误修正。

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

解决方案是获取代码,对其进行修补并进行构建。

© www.soinside.com 2019 - 2024. All rights reserved.