C++线程&无限循环

C++ threads & infinite loop

本文关键字:无限循环 amp 线程 C++      更新时间:2023-10-16

我有一个小问题,我写了一个程序,服务器角色,做了一个无限循环等待客户端请求
但我希望这个程序也能返回他的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吗?请问该怎么做?

谢谢
eo

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

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

最好只使用printf将pid打印到stdout。

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

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

编辑:还请注意ecatmur的回答中所述的main返回值的限制。

我感觉您正在尝试实现守护进程。

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

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

您的main正在尝试做服务器应该做的事情。您在这里混淆了几个模式。

模式#1:守护程序

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

模式#2:工具

或者,您可以简单地将此程序作为一个工具调用。你仍然需要一个网络服务,但这个程序可能与之分离。除了你的工具应该做什么之外,你不应该为此需要线程。

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