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

标签 c++ xml linux xerces-c inetd

我的应用程序是一个服务器应用程序,它接受来自用户的一些预定义命令并显示从服务器端存在的 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/

相关文章:

c++ - std::ftsream 的成员函数 bad() 用于检查

C++ 头文件 (.h) 或 C 中的 .h 文件包含滤波器系数

android - 重新格式化代码时如何避免重新排列 View

java - Android,存储和检索文本

linux - 无法在 Linux 中使用 awk 编辑文件中的现有日期

c++ - 从 const 类继承

c++ - 迭代 vector 时跳过行

xml - 使用 AJAX 抓取的可搜索动态内容

php - UTF-8贯穿始终

linux - 使用Bash-在for循环中重复常量,返回多个结果