运行C ++ CGI脚本作为后台进程?

时间:2009-12-23 13:45:20

标签: c++ c bash unix cgi

我正在研究一个使用libmp3lame的音频编码器cgi脚本。 我正在写C / C ++的混合物。

我计划有一个入口点cgi,可以生成在后台运行的多个编码进程。我需要编码过程是异步的,因为编码可能需要几个小时,但我需要输入点cgi立即返回,以便浏览器可以继续其业务。

我已经为此找到了几个解决方案(有些是完整的/有些没有),但仍有一些我想澄清的事情。

解决方案1(最简单):入口点cgi是一个bash脚本,然后可以通过将输出发送到/ dev / null / 2 /&> 1&amp ;;来在后台运行C ++进程cgi。 (简单!但不是很优雅)。

解决方案2:与解决方案1非常相似,除了入口点cgi在C ++中并使用system()运行proc / s并将输出发送到/ dev / null / 2 /&> 1&试。

[问题]这很有效,但我不确定共享托管公司是否允许使用system()函数。是这种情况吗?

解决方案3(不完整):我已经研究过使用fork()/ pthread_create()来生成单独的线程,这似乎更优雅,因为我可以留在C的领域。唯一的问题是:它似乎是父母在所有子线程都返回之前,线程不会退出。

[问题]有没有办法让父线程退出,同时允许子线程在后台继续。

[想法]也许我可以把孩子的proc / s输出发送到黑洞!我可以简单地将stdout重定向到/ dev / null。如果是这样,我该怎么做?

我希望这对某人有意义。我仍然是一个有C的菜鸟,所以我可能会缺少非常基本的概念(请怜悯!)。

我非常感谢有关此事的任何建议。

非常感谢,

约什

1 个答案:

答案 0 :(得分:3)

你可能想要标准的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,但此代码一直对我有效。