Запуск C ++ CGI Script в качестве фонового процесса? - PullRequest
1 голос
/ 23 декабря 2009

Я работаю над сценарием cgi аудио-кодировщика, который использует libmp3lame. Я пишу в смеси C / C ++.

Я планирую иметь точку входа cgi, которая может порождать несколько процессов кодирования, которые выполняются в фоновом режиме. Мне нужно, чтобы процессы кодирования были асинхронными, поскольку кодирование может занять несколько часов, но мне нужно, чтобы точка входа cgi мгновенно возвращалась, чтобы браузер мог продолжить свою работу.

Я нашел несколько решений для этого (некоторые завершены / некоторые нет), но есть еще несколько вещей, которые я хотел бы прояснить.

Решение 1 (самое простое): точка входа cgi - это bash-скрипт, который затем может запускать процесс cgi C ++ в фоновом режиме, отправляя вывод в / dev / null / 2 / &> 1 & (просто! Но не очень) элегантный).

Решение 2. Очень похоже на решение 1, за исключением того, что точка входа cgi находится в C ++ и использует system () для запуска proc / s и отправки вывода в / dev / null / 2 / &> 1 & again.

[вопрос] Это работает хорошо, но я не уверен, разрешают ли компании с общим хостингом использовать функцию system (). Это тот случай?

Решение 3 (неполное): я рассмотрел использование fork () / pthread_create () для порождения отдельных потоков, что кажется более элегантным, поскольку я могу оставаться в сферах C. Единственная проблема: кажется, что родитель поток не завершается, пока не будут возвращены все дочерние потоки.

[вопрос] Есть ли способ заставить родительский поток выйти, в то же время позволяя дочерним потокам продолжать работу в фоновом режиме.

[идея] Может быть, я смогу отправить вывод дочерней процедуры / с в черную дыру! Могу ли я просто перенаправить стандартный вывод в / dev / null. Если да, то как мне это сделать?

Надеюсь, это имеет смысл для кого-то. Я все еще немного новичок с вещами на C, так что, может быть, я упускаю очень простые концепции (пожалуйста, помилуй!)

Буду очень признателен за любые советы по этому вопросу.

Заранее большое спасибо,

Josh

1 Ответ

3 голосов
/ 23 декабря 2009

Вы, вероятно, хотите использовать стандартную технику демонов Unix, включающую двойную вилку:

void daemonize(void)
{
  if (fork()) exit(0); // fork.  parent exits.
  setsid(); // become process group leader
  if (fork()) _exit(0); // second parent exits.
  chdir("/"); // just so we don't mysteriously prevent fs unmounts later
  close(0); // close stdin, stdout, stderr.
  close(1);
  close(2);
}

Похоже, что современные машины Linux имеют библиотечную функцию daemon(), которая, по-видимому, делает то же самое.

Возможно, первое exit должно быть _exit, но этот код всегда работал для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...