Я использую сервер mongoose 3.7 в моей системе qnx.
Я получаю http запрос на обновление прошивки. По запросу я использую, system()
вызовите обработчик запроса для обновления прошивки.
Но, как ни странно, system()
возвращает 255. Тот же вызов работал раньше с mongoose 2.0.
Еще более странно, команда, которую я дал через system()
звонок работает после того, как вернул 255.
я использую WEXITSTATUS
знать ошибку, которая system()
возвращается
Есть идеи, почему это происходит?
Я нашел проблему ..
Проблема заключалась в том, что поток обратного вызова mongoose, который выдает команду system (), не будет ожидать состояние возврата из-за этой строки:
В функции mg_start (), которая запускает серверный поток, они включили эту строку:
mg_start()
строка № 5159:
(void) signal(SIGCHLD, SIG_IGN);
Они сделали это для того, чтобы не создавать зомби-процесс.
Ref: http://www.win.tue.nl/~aeb/linux/lk/lk-5.html
Но, согласно документации QNX,
«Настройка действия сигнала на
SIG_IGN
для сигнала, который ожидает
вызывает отклонение ожидающего сигнала, независимо от того,
заблокирован. Если процесс устанавливает действие дляSIGCHLD
сигнал к
SIG_IGN
, поведение не определено ».
призвание SIG_IGN
на SIGCHLD
заставляет родительский процесс игнорировать сигнал состояния от дочернего процесса.
Когда мы делаем system()
вызов, он блокирует сигнал SIGCHLD от запускаемой оболочки. Согласно документации UNIX:
«Блокирование
SIGCHLD
в ожидании прекращения ребенка мешает
приложение от перехвата сигнала и получения статуса от
Системный () дочерний процесс доsystem()
может получить статус сам ».
Но, поскольку мангуста сбрасывает сигнал, он не ждет сигнала от system()
совсем.
Он просто продолжает обслуживать ответ без действительного статуса возврата от system()
,
Я только что закомментировал эту строку на данный момент. И это работает.
Других решений пока нет …