2013-12-09 48 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