C ++线程&无限循环

时间:2012-07-13 07:40:15

标签: c++ multithreading pthreads

我有一点问题,我写了一个程序,服务器角色,做一个等待客户请求的无限循环 但是我希望这个程序也可以归还他的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

4 个答案:

答案 0 :(得分:3)

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

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

最好使用main将pid打印到标准输出。

答案 1 :(得分:1)

我觉得你正在尝试实施daemon

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

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

答案 2 :(得分: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的回答中所述。

答案 3 :(得分:0)

您的主要人员正在尝试执行您的服务器应该执行的操作。你在这里混淆了几种模式。

模式#1:守护进程

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

模式#2:工具

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

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