3

我有一个小问题,我写了一个程序,服务器角色,做一个无限循环等待客户端请求。
但我希望这个程序也能返回他的 pid。
因此,我认为我应该使用多线程。
这是我的主要内容:

int main(int argc, char **argv) {

    int pid = (int) getpid();
    int port = 5555

    ServerSoap *servsoap;
    servsoap = new ServerSoap(port, false);
    servsoap->StartServer(); //Here starts the infinite loop

    return pid; //so it never executes this
}

如果是 bash 脚本,我会添加&以在后台运行它。
我应该使用 pthread 吗?请问该怎么做?

谢谢。

4

4 回答 4

4

当程序返回(退出)时,所有正在运行的线程都会终止,因此您不能让后台线程继续运行。

此外, 的int返回值main(通常)被截断为 7 位值,因此您没有足够的空间来返回完整的 pid。

最好使用 . 将 pid 打印到标准输出printf

于 2012-07-13T07:44:49.267 回答
1

我有一种感觉,您正在尝试实现daemon

要添加到@ecatmur 答案,如果没有发生错误,程序应始终在终止时返回 0。

PID 通常保存在某个文件中,通常在 /var/run/ 目录中。有些程序使用 /tmp/ 目录。

于 2012-07-13T07:47:24.167 回答
1

如果你把无限循环放在一个单独的线程中,然后从main它返回将杀死整个进程,包括你的新线程。保持线程的一种解决方案是制作一个分离的线程。更好的解决方案可能是创建一个新进程:

int main()
{
    int pid = fork();
    if (pid == -1)
        perror("fork");
    else if (pid == 0)
    {
        ServerSoap serversoap(5555, false);
        serversoap.StartServer();
    }

    return pid;
}

编辑:main还请注意从 ecatmur 的答案中指出的返回值的限制。

于 2012-07-13T07:48:29.347 回答
0

你的主要是试图做你的服务器应该做的事情。你在这里混淆了几个模式。

模式 #1:守护进程

将 main 视为程序,当它打开时,接受客户端请求并对其执行操作。如果这是程序的结构,则 main 必须等待请求。收到请求后,您才执行请求的操作。main 仅用于打开或关闭此服务。通常这种类型的行为默认由线程处理。例如,侦听器会激活一个线程,该线程调用具有有关请求的信息的特定方法。除非您需要线程来完成您需要完成的工作,否则您不应该为此需要线程。

模式#2:工具

或者,您可以简单地将此程序称为工具。您仍然需要一个 Web 服务,但该程序可以与该程序分开。除了你的工具应该做的事情之外,你不应该为此需要线程。

无论哪种情况,我认为您要寻找的不是实现线程。您只是在激活一个什么都不做的服务器。您可能应该考虑添加请求处理程序。

于 2012-07-13T07:51:44.723 回答