如何控制后台进程/守护进程

4
我目前正尝试在Linux上使用C++创建一个程序,但我对此还不是很熟悉。该程序应该在后台处理其任务(网络通信和计算),并可以通过终端命令进行控制,比如“prog -start”,“prog -stop”,“prog -limitUp 1000”。
我的想法是将程序创建为守护进程,以始终在后台运行。为了控制整个过程,我考虑设置一个Linux命令,将给定的参数传递给程序的主函数,并尝试重新连接到后台中的守护进程来执行给定的命令。
实现这种功能的最佳方法是什么(即在后台侦听的守护进程和可用于控制它的客户端/命令)?

2
什么是问题? - ensc
我的想法是否会是糟糕的编码/不良使用守护进程? - Chris Weber
1
这个想法不错。只需使用套接字或其他IPC方案(例如命名管道)。最简单的方法是重用同一项目,类似于busybox风格-根据cmd行参数拆分代码路径。这就是我自己所做的。 - sashoalm
1个回答

5
这是一个使用C++/Qt构建的示例程序。如果没有给出参数,该进程将作为守护进程启动,并侦听命名本地套接字。
如果给出了参数,则连接到该本地套接字并发送其参数。然后守护进程将打印它们。
#include <QCoreApplication>
#include <QLocalServer>
#include <QLocalSocket>
#include <QStringList>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    if (a.arguments().size() == 1) {
        // Act as a server.
        QLocalServer server;
        server.listen("MyDaemon");
        while (server.waitForNewConnection(-1)) {
            QLocalSocket *socket = server.nextPendingConnection();
            socket->waitForReadyRead();
            qDebug() << "received message" << socket->readAll();
            delete socket;
        }
    } else {
        // Act as a client.
        QLocalSocket socket;
        socket.connectToServer("MyDaemon");
        socket.waitForConnected();
        socket.write(a.arguments().join(' ').toUtf8() + "\n");
        socket.waitForBytesWritten();
    }

    return 0;
}

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接