C++线程&无限循环
C++ threads & infinite loop
我有一个小问题,我写了一个程序,服务器角色,做了一个无限循环等待客户端请求
但我希望这个程序也能返回他的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打印到stdout。
如果你把无限循环放在一个单独的线程中,然后从main
返回,它将杀死整个进程,包括你的新线程。保留线程的一种解决方案是制作一个分离的线程。一个更好的解决方案可能是创建一个新的过程:
int main()
{
int pid = fork();
if (pid == -1)
perror("fork");
else if (pid == 0)
{
ServerSoap serversoap(5555, false);
serversoap.StartServer();
}
return pid;
}
编辑:还请注意ecatmur的回答中所述的main
返回值的限制。
我感觉您正在尝试实现守护进程。
若要添加到@ecatmur答案,若并没有发生任何错误,程序在终止时应始终返回0。
PID通常保存在某个文件中,有时保存在/var/run/目录中。有些程序使用/tmp/目录。
您的main正在尝试做服务器应该做的事情。您在这里混淆了几个模式。
模式#1:守护程序
将main想象成一个程序,当它打开时,它接受客户端请求并对它们执行操作。如果这是程序的结构,main必须等待请求。收到请求后,您才能执行请求的操作。main仅用于打开或关闭此服务。通常情况下,这种类型的行为默认由线程处理。例如,侦听器激活一个线程,该线程使用有关请求的信息调用特定的方法。除非你需要线程来完成你需要完成的工作,否则你不应该为此需要线程。
模式#2:工具
或者,您可以简单地将此程序作为一个工具调用。你仍然需要一个网络服务,但这个程序可能与之分离。除了你的工具应该做什么之外,你不应该为此需要线程。
无论哪种情况,我都不认为您想要的是实现线程。你只是激活了一个什么都不做的服务器。您可能应该考虑添加请求处理程序。
- 过载'operator new'如何导致无限循环?
- C++正则表达式无限循环
- 程序在尝试猜测它选择的随机数时进入无限循环?
- 遍历链表时的无限循环
- 循环链表:无限循环
- 比较两个字符串后卡在无限循环中
- 在做一段时间内检查字符的无限循环
- 逐字读取文本文件中的每一行并转换为 int(无限循环或崩溃?
- 在这个无限循环中,当输入 0 时终止,当输入 int 范围之外的任何内容时,程序行为不正常
- 可能的无限循环
- 超出 int 的值范围后的无限循环
- 为什么这段代码会导致无限循环?
- 运行无限循环的最小二叉树问题
- 在分配和发布递增循环迭代器时C++无限循环(gcc 错误?
- 连接线程时的无限循环
- 为什么这种方法会进入无限循环?
- 由于QTextStream的无限循环
- Qt 在另一个线程中无限循环
- 从文件 C++ 读取时的无限循环
- 试图找出为什么我的代码保持无限循环