2009-12-23 117 views
1

我正在研究利用libmp3lame的音頻編碼器cgi腳本。 我正在寫C/C++的混合。運行C++ CGI腳本作爲後臺進程?

我打算有一個入口點cgi,它可以產生多個在後臺運行的編碼進程。我需要編碼過程是異步的,因爲編碼可能需要幾個小時,但我需要入口點cgi立即返回,以便瀏覽器可以繼續其業務。

我已經找到了幾個解決方案(有些完整的/一些沒有),但仍然有一些事情我想清除。

溶液1(最簡單的):該入口點的CGI是一個bash腳本,然後可以通過將輸出發送到在後臺運行一個C++過程CGI的/ dev/null的/ 2/&> 1 &(simples但不是很優雅)。解決方案2:除了入口點cgi使用C++並使用system()來運行proc/s並將輸出再次發送到/ dev/null/2/&> 1 &,與解決方案1非常相似。

[question]這很好,但我不確定共享主機公司是否允許使用system()函數。是這樣嗎?解決方案3(不完整):我研究過使用fork()/ pthread_create()來產生單獨的線程,這似乎更優雅,因爲我可以留在C領域。唯一的問題是:看起來直到所有子線程都返回後,父線程纔會退出。

[question]有沒有辦法讓父線程退出,同時允許子線程在後臺繼續。

[idea]也許我可以把child proc/s的輸出發送到黑洞!我可以簡單地將stdout重定向到/ dev/null。如果是這樣,我該怎麼做?

我希望這對某人有意義。我對C的東西仍然有些不滿,所以我可能會缺少非常基本的概念(請留下憐憫!)。

我非常感謝有關此事的任何建議。

提前許多感謝,

喬希

+0

閱讀此鏈接: http://apidock.com/ruby/Process/detach/class – whunmr 2009-12-23 18:22:44

回答

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,但這段代碼一直對我有用。

+0

優秀。我以前沒有遇到過這個。我會得到測試。 會回寫一下。謝謝回覆。 – Josh 2009-12-23 18:31:37

+0

哇!直接從盒子中取出。謝謝。我不太清楚fs的卸載位 - 但是,嘿,它可行!乾杯。喬希。 – Josh 2009-12-23 19:01:28

+0

每個進程都會保存對當前工作目錄的引用。如果您嘗試卸載文件系統(即使是低閃存驅動器),而有人仍然持有對文件系統中任何內容的引用,它將會失敗。這看起來很神祕,如果它是一個在後臺運行的程序來保存文件系統。守護進程的通常做法是爲'chdir(「/」)',這樣的事情不會發生。 – 2009-12-23 20:39:27