gpt4 book ai didi

c++ - 程序在前台工作,但不在后台使用 nohup

转载 作者:太空宇宙 更新时间:2023-11-04 13:58:09 24 4
gpt4 key购买 nike

我目前正在为我的 iOS 游戏编写服务器后端。该服务器是用 C++ 编写的,并在一个删除的 Ubuntu 服务器上编译和运行。我使用

通过 SSH 启动服务器

sudo nohup ./mygameserver &

服务器通信是用 TCP 编写的。带有读取循环的主要函数是使用标准 C socket.h/netdb.h/in.h 编写的,并使用 select() 在非阻塞监听套接字上接受许多用户。

当我通过 SSH 在前台运行服务器时,一切似乎都运行良好。它接收我以正确顺序发送的所有数据包,并带有正确的 header 信息。然而,当我使用 nohup 并断开与 SSH 的连接时......一切似乎都崩溃了。当服务器软件在没有 SSH/nohup 模式的情况下运行时,来自用户连接的典型日志如下所示:

CONNECTED TO SQL
Server starting...
Second thread initialized
Entering order loop
Got a new message of type: 0
Got a new message of type: 0
Got a new message of type: 0
Got a new message of type: 0
<this line continues ad infinitum>

我真的不知道为什么。我确保每次打印都转到 nohup.out 而不是 std::cout,并且服务器每 10 秒向 MySQL 发送一次更新以避免超时。

对这里的问题有什么想法或意见吗?如果您想要一些代码示例,请告诉我,我只是不知道哪些代码示例对这个问题特别感兴趣。提前致谢。

最佳答案

我发现了问题。

在我的服务器程序中,我有一个 readSockets() 函数,它在主服务器循环中调用 select() 之后调用。 readSockets() 函数响应在启动时由 nohup 推送到 stdin 的换行符(出于我不知道的原因),并且由于 stdin 实际上也是连接到文件描述符的 FILE* ,我的 readSockets() 函数响应到标准输入作为连接客户端。

这显然导致服务器崩溃,因为标准输入从未被刷新(因此每次 select() 返回时都会被读取)。这再次阻止了其他用户的线程。

关于c++ - 程序在前台工作,但不在后台使用 nohup,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20467577/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com