【问题标题】:C++ threads & infinite loopC++ 线程和无限循环
【发布时间】:2012-07-13 07:40:14
【问题描述】:

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

谢谢。
呵呵

【问题讨论】:

    标签: c++ multithreading pthreads


    【解决方案1】:

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

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

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

    【讨论】:

    • 好的,我可以看到,但是我想获取这个 pid,因为这个程序是由另一个程序运行的,我想存储 pid,以便随时终止进程
    • program --pid_file /tmp/program.pid && kill `cat /tmp/program.pid`
    【解决方案2】:

    如果你将无限循环放在一个单独的线程中,然后从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】:

      我感觉你正在尝试实现daemon

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

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

      【讨论】:

        【解决方案4】:

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

        模式 #1:守护进程

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

        模式#2:工具

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

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

        【讨论】:

          猜你喜欢
          • 2014-11-12
          • 1970-01-01
          • 2020-08-13
          • 1970-01-01
          • 2021-02-21
          • 2023-03-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多