gpt4 book ai didi

c++ - 当守护进程通过 inetd 运行时,xerces-c 库函数返回 NULL

转载 作者:太空宇宙 更新时间:2023-11-04 10:48:29 24 4
gpt4 key购买 nike

我的应用程序是一个服务器应用程序,它接受来自用户的一些预定义命令并显示从服务器端存在的 XML 文件中获取的相应输出。

为了解析 XML 文件,我使用了 apache 的 xerces-c 库版本 3.1.2。该应用程序在终端上手动运行时工作正常。

但我想通过网络上的 telnet 运行应用程序,这样我就可以通过 telnet 向应用程序提供输入并在远程系统上接收输出。为此,我使用了 inetd super 服务器并在 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 和 cout,效果非常好。

后来发现我的应用程序出了点问题,所以为此我使用了大量的 cout 来确定实际发生了什么。有了这个,我发现其中一个 xerces-c XML 解析库函数正在返回 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;
}

上面的代码在手动编译和运行时不会进入“Doc is NULL”的条件并成功打印根元素标签名称,但是当我在 inetd 后面运行这个应用程序并且当我远程登录到它时我是能够看到“Doc​​ is NULL”语句,并在相同的消息“Connection closed by foreign host”之后。因为我的应用程序可能会被倾销。

我现在有点疯了,因为我不确定到底要看哪里。因为相同的代码在手动运行时有效,但不能通过 inetd 运行。所以,我在想,在通过使用共享库的 inetd 执行进程时,我们是否需要特别注意,就像我在这里使用 xerces-c 共享库进行 XML 解析一样。或者我的理解或我的代码还有什么可能有问题。为什么相同的库函数在应用程序手动运行时工作得很好,而在通过 inetd 运行时却不起作用?

我尝试使用 xinetd 而不是 inetd,但结果相同。

最佳答案

正如您自己所证明的,当您通过inetd 启动您的工具时,工作目录是/。但是您的 XML 文件不在系统的根目录中。您可以将完整路径硬连接到您的应用程序中。更好的解决方案是将文件的位置作为参数传递。

关于c++ - 当守护进程通过 inetd 运行时,xerces-c 库函数返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32058363/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com