diff --git a/~/C/rest_server/qa/answer.png b/~/C/rest_server/qa/answer.png new file mode 100644 index 0000000..f64d3ae Binary files /dev/null and b/~/C/rest_server/qa/answer.png differ diff --git a/~/C/rest_server/qa/question.md b/~/C/rest_server/qa/question.md new file mode 100644 index 0000000..0c201b4 --- /dev/null +++ b/~/C/rest_server/qa/question.md @@ -0,0 +1,61 @@ +Помогите с проблемой. Не завершается `while` цикл при изменении переменной `running`. + +``` +while (running) { + // loop +} +``` + +Использую библиотеку `ulfius` для реализации REST API сервера. +Есть функция `thread_server()`, которую из `main()` запускаю в отдельном потоке, +в которой запускается `ulfius` сервер. + +``` +pthread_t tid; +pthread_create(&tid, NULL, thread_server, (void *)&tid); +``` + +Сервер запускаю следующим образом: +``` +int ret; +ret = ulfius_start_framework(&instance); + +if (ret == U_OK) { + printf("Server started at %d.\n", PORT); +} else { + printf("Error starting server as %d port.\n", PORT); +} + +while (running) { + printf("\r%b", running); +} +printf("Server halt.\n"); + +ulfius_stop_framework(&instance); +ulfius_clean_instance(&instance); +``` + +`running` - глобальная переменная типа `bool`. + +В документации к библиотеке, чтобы сервер не схлопывался используется следующий код. +``` +if (ret == U_OK) { + getchar(); +} +``` + +Есть callback функция, которая вызывается при обращении к API, +в которой я проверяю отправленное пользователем значение, и если оно равняется `quit` +присваиваю переменной `running` значение `false`, чтобы сервер закрылся. + +Если из цикла `while (running) { printf("\r%b", running); }` убрать `printf()`, +либо выполнять другие операции, например присвоение `a = 1;` то сервер не закрывается, +хотя значение `running` равняется `0`. + +Я пишу утилиту для внутенного использования, которая общается с Arduino платой +посредством библиотеки `libserialport` и в цикле читает данные. + +Хочу, чтобы утилита по REST получала данные и отправляла их на плату, +но не получается реализовать нормальное завершение программы, потому что сервер не умирает. + +**OS:** Linux