Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2024, 10:30   #1
Rootoz
Новичок
Джуниор
 
Регистрация: 14.02.2024
Сообщений: 1
По умолчанию Почему Apache2 сервер в Linux ждёт завершения дочернего отсоединённого потока, когда родительский процесс уже завершён?

В Windows нормально работает. В старых версиях Debian Linux тоже нормально работает, но установил Debian 12 и не работает.

Код:
#include <iostream>
#include <string>
#include <thread>
 
 
void StartCommandDetach(const std::string & command)
{
    std::thread t([command]()
    {
        std::system(command.data());
    });
 
    t.detach();
}
 
 
int main()
{
#ifdef WIN32
    StartCommandDetach("timeout 5");
#else
    StartCommandDetach("sleep 5");
#endif
 
    std::this_thread::sleep_for(std::chrono::milliseconds(1)); // пауза 1 мс
 
    std::cout << R"(Content-Type: text/html; charset=utf-8
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: true
Content-length: 14
 
{"test": 1234})";
 
    return 0;
}
Записываем исходник в файл test.cpp и компилируем в консоли Linux:

c++ test.cpp -std=c++20 -o test.exe

Получаем рядом с test.cpp запускаемый test.exe.
Настраиваем cgi в apache2 и открываем в браузере test.exe. Должен сразу отобразиться результат {"test": 1234}, но результат в Debian 12 отображается после выполнения sleep 5, c задержкой в 5 секунд, хотя этому процессу сделали detach. В Windows и старых версиях Debian отображается сразу.

Когда запускаю из консоли

./test.exe

результат в консоль выводится сразу и сразу даёт печатать следующую команду. С чем это может быть связано? Как сделать так, чтобы apache2 не ждал завершения отсоединённых потоков?

Если

StartCommandDetach("sleep 5");

заменить на

StartCommandDetach("sleep 5 > /tmp/sleep.txt");

и закомментировать

std::this_thread::sleep_for(std::ch rono::milliseconds(1));

то главная программа настолько быстро завершается, что не срабатывает запуск дочернего потока, файлик /tmp/sleep.txt не появляется. С раскомментированной паузой 1 мс файлик /tmp/sleep.txt появляется. Хотя, по логике, если прописан запуск дочернего потока, то, в любом случае, он должен сначала запуститься, а затем возможен выход из родительской программы. Похоже, это баг std-библиотеки.
Rootoz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Процесс-клиент отправляет построчно файл серверу. Сервер выводит полученные датаграммы на экран / С под Linux Nickolay0512 C/C++ Сетевое программирование 0 29.03.2014 06:08
как заставить родительский div растягиваться по высоте дочернего Arassir HTML и CSS 9 16.10.2013 15:20
Передача значения из дочернего процесса в родительский MrGukk Общие вопросы C/C++ 0 03.09.2012 20:03
Родительский процесс Den7656 Win Api 2 09.09.2011 17:11
Программа не ждёт завершения ввода ProgDel Общие вопросы C/C++ 4 30.10.2010 16:05