Системный вызов возвращает 255, но затем выполняется

Я использую сервер mongoose 3.7 в моей системе qnx.

Я получаю http запрос на обновление прошивки. По запросу я использую, system() вызовите обработчик запроса для обновления прошивки.

Но, как ни странно, system() возвращает 255. Тот же вызов работал раньше с mongoose 2.0.

Еще более странно, команда, которую я дал через system() звонок работает после того, как вернул 255.

я использую WEXITSTATUS знать ошибку, которая system() возвращается

Есть идеи, почему это происходит?

2

Решение

Я нашел проблему ..

Проблема заключалась в том, что поток обратного вызова 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(),

Я только что закомментировал эту строку на данный момент. И это работает.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]