Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;线程及;无限循环_C++_Multithreading_Pthreads - Fatal编程技术网

C++ C++;线程及;无限循环

C++ C++;线程及;无限循环,c++,multithreading,pthreads,C++,Multithreading,Pthreads,我有一个小问题,我编写了一个程序,服务器角色,执行无限循环,等待客户端请求。 但是我希望这个程序也能返回他的pid。 因此,我认为我应该使用多线程。 以下是我的主要观点: int main(int argc, char **argv) { int pid = (int) getpid(); int port = 5555 ServerSoap *servsoap; servsoap = new ServerSoap(port, false); serv

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

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

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


最好只使用
printf

将pid打印到标准输出,我感觉您正在尝试实现

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


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

如果将无限循环放在一个单独的线程中,然后从
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的回答中所述。

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

模式1:守护进程 可以将main看作是一个程序,当它打开时,它接受客户机请求并使用它们执行操作。如果这是程序的结构,那么main必须等待请求。收到请求后,才执行请求的操作。main仅用于打开或关闭此服务。通常,默认情况下,线程会处理此类行为。例如,侦听器激活一个线程,该线程调用特定的方法,并提供有关请求的信息。除非你需要线程来完成你需要完成的工作,否则你不应该需要线程

模式#2:工具 或者,您可以简单地将此程序称为工具。您仍然需要一个web服务,但是这个程序可以独立于此。除了你的工具应该做什么,你不应该为此需要线程


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

OK我可以看到,但是我想得到这个pid,因为这个程序是由另一个程序运行的,我想存储这个pid,以便在需要时终止进程
program--pid\u file/tmp/program.pid&&kill`cat/tmp/program.pid`