2013-12-09 68 views
0

我目前正在为我的iOS游戏编写服务器后端。该服务器是用C++编写的,编译&在删除Ubuntu服务器上运行。我通过SSH使用程序在前台运行,但不能在后台使用nohup

须藤nohup的./mygameserver &

服务器的通信是用TCP启动服务器。读循环的主要功能是使用标准C socket.h/netdb.h/in.h编写的,并使用select()接受非阻塞侦听套接字上的许多用户。

当我通过SSH在前台运行服务器时,一切似乎都正常工作。它会以正确的顺序收到我发送的所有数据包,并收到正确的标题信息。但是,当我使用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发送一次更新以避免超时。

关于这里有什么问题的任何想法或意见?让我知道如果你想要一些代码示例,我只是不知道哪些对这个问题特别有意思。提前致谢。

+0

但是,据我所知,nohup“神奇地”将stdout的FD更改为nohup.out文件。至少它在运行时输出以下内容:“nohup:忽略输入并将输出追加到'nohup.out'”。我确实得到了该文件中的输出......我只是没有得到我期望的输出。 –

+0

您可能想要添加更多日志记录。另外,现在你的问题是没有办法告诉可能是什么问题。除非您将其缩小到某些特定的代码,并且在问题中包含该代码,否则我们无法为您提供帮助。 –

回答

0

我发现了什么是错的。

在我的服务器程序中,我有一个readSockets()函数,它在主服务器循环中调用select()之后调用。 readSockets()函数在启动时通过nohup将新行字符转换为stdin(出于某些原因,我不知道),而stdin实际上也是一个连接到文件描述符的FILE *,我的readSockets()函数响应以stdin作为连接客户端。

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

+1

但是解决方案是什么?找出原因很好,但如何避免它? – LovesTha

+0

我的解决方案:从fds中删除stdin。 – LovesTha