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`