Linux скрипт, выполняющийся из кода C ++ с execv, завершается неудачно - PullRequest
0 голосов
/ 06 января 2020

У меня очень простой c 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 минут). После этого короткого периода выполнения сценария происходит сбой, код возврата n c равен 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?

Как мне преодолеть эту проблему?

1 Ответ

0 голосов
/ 07 января 2020

Эта проблема была вызвана netcat .

Сначала я не осознал важность этого сообщения:

Preposterous fd value 17

На самом деле это очень важное сообщение об ошибке netcat, потому что он не был разработан для работы с более высокими fds, чем 16, по умолчанию, что полностью приемлемо для простых сценариев.

Однако в многопоточных средах при вызове netcat уже может быть более 16 fds used.

Это сообщение от 2007 года, в котором в качестве исправления обновляется 16-1024.

Официальной веб-страницей Netcat является https://nc110.sourceforge.io, и текущая версия - 1.10, которая по-прежнему определяет FD_SETSIZE как 16.

Решение было получить код, исправить его и собрать.

...