Функция библиотеки xerces-c возвращает NULL, когда демон запускается через inetd

Мое приложение — это серверное приложение, которое принимает некоторые предопределенные команды от пользователя и отображает соответствующий вывод, полученный из файлов XML, имеющихся на стороне сервера.

Для анализа XML-файла я использую библиотеку xerces-c версии 3.1.2 из apache. Приложение работает нормально, когда запускается вручную на терминале.

Но я хотел запустить приложение через telnet в сети, чтобы я мог передавать входные данные приложению через telnet и получать выходные данные в удаленной системе. Для этого я использовал супер-сервер inetd и добавил следующую строку в inetd.conf:

vterm stream tcp nowait root /path/to/my/binary/vterm vterm

Затем добавьте строку ниже в / etc / services, чтобы он прослушивал порт 5000

vterm 5000/tcp

После этого, когда я пытался подключиться к своему приложению, я получал сообщение ниже:

msatyam@sabayon ~/programming/cpp/xml $ telnet localhost 5000
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.

Когда вышеприведенное сообщение о закрытии соединения пришло, я подумал, что не правильно настроил свое приложение с помощью inetd. Итак, я заменил свой двоичный файл на простой двоичный файл, который не использовал никаких дополнительных библиотек. Просто Cin’s и Cout’s, которые отлично работали.

Тогда, оказывается, что-то не так с моим приложением, поэтому для этого я приложил много усилий, чтобы определить, что на самом деле происходит. После этого я обнаружил, что одна из функций библиотеки синтаксического анализа XML xerces-c возвращает NULL, и с помощью этой ссылки NULL я пытаюсь вызвать функцию в строке ниже, которая выполняет дамп моего приложения, как только он запускается.

Но дело в том, что та же функция работает нормально, когда я запускаю приложение вручную на терминале. Полное приложение немного велико, поэтому я создал демонстрационный код, который воспроизводит проблему. Вот мой код:

    #include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/dom/DOMDocument.hpp>
#include <xercesc/dom/DOMElement.hpp>
#include <iostream>

using namespace std;
using namespace xercesc;

int main()
{
try
{
// init xerces XML Parser library
XMLPlatformUtils::Initialize();
}
catch (const XMLException& ex)
{
cerr << ex.getMessage() << endl;
}

// parse a XML file
XercesDOMParser* parser = new XercesDOMParser();
try
{
parser->parse("sample.xml");
}
catch (const XMLException& ex)
{
cerr << ex.getMessage() << endl;
}

// get the document reference
DOMDocument* doc = parser->getDocument();

if (doc == NULL)
{
cout <<"Doc is NULL" << endl;
}

// else do stuff further
// like get root element
DOMElement* root = doc->getDocumentElement();

// print node name
string name = XMLString::transcode(root->getTagName());
cout << "Name: " << name << endl;

XMLPlatformUtils::Terminate();
return 0;
}

Приведенный выше код при компиляции и запуске вручную не входит в условие if, которое говорит «Doc is NULL» и успешно печатает имя тега корневого элемента, но когда я запускаю это приложение за inetd и когда я telnet к нему, я вижу «Doc is NULL» и после того же сообщения «Соединение закрыто внешним хостом». как мое приложение, вероятно, будет сбрасывать.

Сейчас я немного не в себе, так как не знаю, где именно искать. Так же код работает, когда запускается вручную, но не через inetd.
Итак, я думаю, нужно ли уделять особое внимание при выполнении процессов через inetd, который использует разделяемые библиотеки, как здесь я использую разделяемую библиотеку xerces-c для анализа XML.
Или что еще может быть не так с моим пониманием или моим кодом.
Почему одни и те же библиотечные функции прекрасно работают, когда приложение запускается вручную, и не работают при запуске через inetd?

Я попробовал то же самое, используя xinetd вместо inetd, но результаты те же.

0

Решение

Как вы уже убедились, рабочий каталог / когда вы запускаете инструмент через inetd, Но ваш XML-файл не находится в корневом каталоге вашей системы. Вы можете проложить полный путь к вашему приложению. Лучшим решением было бы передать местоположение вашего файла (ов) в качестве параметра.

1

Другие решения


По вопросам рекламы [email protected]