2013-12-09 3 views
0

В настоящее время я пишу серверный сервер для своей игры iOS. Сервер написан на C++ и скомпилирован & запущен на удаленном сервере Ubuntu. Я запустить сервер через SSH с помощьюПрограмма работает на переднем плане, но не в фоновом режиме, используя nohup

SUDO поЬир ./mygameserver &

на сервер связи написано в TCP. Основная функция с циклом чтения записывается с использованием стандартного C socket.h/netdb.h/in.h и использует select() для приема многих пользователей в неблокирующем гнезде для прослушивания.

Когда я запускаю сервер на переднем плане через SSH, все работает нормально. Он получает все пакеты, которые я отправляю в правильном порядке, и с правильной информацией заголовка. Когда я использую nohup и отключусь от SSH, однако ... Все, кажется, падает. Типичный журнал от пользователя подключиться, когда программное обеспечение сервер работает без SSH/в поЬир режиме выглядит следующим образом:

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, и сервер отправляет обновление MySQL каждые 10 секунд, чтобы избежать тайм-аутов.

Любые идеи или вводные данные о том, что здесь не так? Дайте мне знать, если вы хотите получить некоторые образцы кода, я просто не знаю, какие из них интересны для этой проблемы в частности. Заранее спасибо.

+0

Но nohup «волшебным образом» изменяет FD stdout на файл nohup.out, насколько я знаю. По крайней мере, при запуске он печатает следующее: «nohup: игнорирование ввода и добавление вывода к« nohup.out »». Я получаю вывод в этом файле ... Я просто не получаю вывод, который я ожидаю. –

+0

Возможно, вы захотите добавить больше протоколов. Кроме того, поскольку ваш вопрос сейчас, на самом деле нет способа рассказать, что может быть проблемой. Если вы не сузите его до определенного кода и не включите этот код в вопрос, мы не сможем вам помочь. –

ответ

0

Я узнал, что случилось.

В моей программе сервера у меня есть функция readSockets(), которая вызывается после вызова select() в цикле основного сервера. Функция readSockets() ответила на символ новой строки, нажатый на stdin (по причинам, которые я не знаю) nohup при запуске, и поскольку stdin, по сути, также является файлом *, связанным с файловым дескриптором, моя функция readSockets() ответила для stdin в качестве подключающегося клиента.

Это, очевидно, привело к сбою сервера, поскольку stdin никогда не загорался (и поэтому он читался каждый раз, когда select() возвращался). Это снова заблокировало поток для других пользователей.

+1

Но каково было решение? Идентификация причины велика, но как ее избежать? – LovesTha

+0

Мое решение: удалите stdin из fds. – LovesTha

 Смежные вопросы

  • Нет связанных вопросов^_^