我有一点问题,我写了一个程序,服务器角色,做一个等待客户请求的无限循环 但是我希望这个程序也可以归还他的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
答案 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)
您的主要人员正在尝试执行您的服务器应该执行的操作。你在这里混淆了几种模式。
将main视为程序,当启用时,接受客户端请求并使用它们执行操作。如果这是程序的结构,主要必须等待请求。收到请求后,才会执行请求的操作。主要仅用于打开或关闭此服务。通常,默认情况下会使用线程处理此类行为。例如,监听器激活调用具有关于请求的信息的特定方法的线程。除非您需要完成所需工作的线程,否则不应该为此提供线程。
或者,您可以简单地将此程序称为工具。您仍然需要Web服务,但此程序可能与此分开。除了你的工具应该做什么,你不应该为此需要线程。
在任何一种情况下,我都不认为你想要的是实现线程。你只是激活一个什么都不做的服务器。您应该考虑添加请求处理程序。