2012-06-28 79 views
2

如何啓動emacs lisp中的進程,該進程在emacs lisp程序結束後將繼續運行?我正在編寫一個實用程序腳本,它應該啓動一個交互式GUI程序並退出。在lisp程序結束後emacs lisp中的啓動過程

在此先感謝。

編輯:我想我正在尋找這個C++代碼的emacs lisp等價物。

#include <cstdlib> 
#include <sys/types.h> 
#include <unistd.h> 

int main() { 
    using namespace std; 

    pid_t p = fork(); 
    if (p == 0) { 
     // child process 
     execl("process_to_run", "process_to_run", nullptr); 
    } else { 
     // stuff for parent to do 
    } 

    return 0; 
} 

回答

2

它可能不是回答你的問題完全,但下面的包讓人很類似的東西你想要什麼:https://bitbucket.org/jpkotta/openwith/overview

它基本上打開外部程序文件(如默認隨時,GIMP ...)和

「在Unix上的nohup中封裝命令,因此如果Emacs退出,啓動的進程將不會退出。」

我不知道它的實現細節,但你可以嘗試閱讀他們的代碼。適用於我。

2

據我所知,沒有防止從Emacs的退出時終止其子流程,無論是同步的,異步的,或經由shell-command執行的方法。如果您使用任何Emacs原語執行子進程(例如,start-processcall-process及其變體),並在進程完成之前嘗試退出Emacs,Emacs將始終提示您殺死它們或自動殺死它們,對每個所述過程設置process-query-on-exit-flagnil。嘗試使用某種涉及shell-commandbash內置插件一樣bgdisownsetsid等基於殼兩輪牛車的是沒有意義的,因爲shell-command最終調用上述start-processcall-process元。另一方面,我認爲ELisp對於腳本來說是一個極其糟糕的選擇(如果你的腳本不是完全用ELisp編寫的,那麼我就不會理解你爲什麼需要從Emacs本身執行你的子流程)。您可能考慮的一種可能是啓動Emacs作爲守護進程(它會自動從控制終端分離Emacs並啓動可與之通信的服務器進程),並使用emacsclient -e向其發出命令。我不知道這是否適用,但它可能是有用的。

你還沒有真正提供過關於你的腳本的任何細節,所以現在很難提供任何進一步的具體建議。我會這樣說:理想的做法是簡單地編寫需要在bash中獨立於Emacs運行的腳本部分,並使用其作業控制機制(即運行後臺進程和disown等),或者一些其他腳本語言,比如Perl(我相信它明確具有它自己的fork()函數)。