我正在研究一个使用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的菜鸟,所以我可能会缺少非常基本的概念(请怜悯!)。
我非常感谢有关此事的任何建议。
非常感谢,
约什
答案 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
,但此代码一直对我有效。