2

emacslispプログラムが終了した後も実行を継続するemacslispのプロセスを開始するにはどうすればよいですか?インタラクティブなGUIプログラムを開始して終了するユーティリティスクリプトを書いています。

前もって感謝します。

編集:私はこのC++コードに相当するemacslispを探していると思います。

#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;
}
4

2 に答える 2

2

私の知る限り、同期、非同期、またはを介して実行されるかどうかにかかわらず、Emacsが終了時にサブプロセスを終了するのを防ぐ方法はありませんshell-commandstart-processサブプロセス(またはそのバリアント)を実行するためにEmacsプリミティブのいずれかを使用しcall-process、プロセスが終了する前にEmacsを終了しようとすると、Emacsは常にそれらを強制終了するか、設定している場合は自動的に強制終了します。上記process-query-on-exit-flagnil各プロセスに対して。、、、shell-commandなどのbash組み込みのシェルベースのハッカーを使用しようとしても、最終的に前述のプリミティブが呼び出されるため、意味がありません。bgdisownsetsidshell-commandstart-processcall-process

余談ですが、ELispはスクリプティングには非常に貧弱な選択だと思います(スクリプトが完全にELispで書かれていない場合、Emacs自体からサブプロセスを実行する必要がある理由がわかりません)。考えられる可能性の1つは、Emacsをデーモンとして起動し(Emacsを制御端末から自動的に切り離し、emacsclient通信可能なサーバープロセスを開始する)、それを使用emacsclient -eしてコマンドを発行することです。それが当てはまるかどうかはわかりませんが、役に立つかもしれません。

スクリプトについての詳細は実際には提供されていないため、現時点でこれ以上具体的なアドバイスを提供することは困難です。私はこれを言います:正しいことは、Emacsから独立して動作し、bashそのジョブ制御メカニズムを使用する必要があるスクリプトの部分を書くことです(つまり、バックグラウンドプロセスとdisownそれを実行するなど)、または他の何かPerlなどのスクリプト言語(明示的に独自のfork()機能があると私は信じています)。

于 2012-06-29T08:33:54.450 に答える
2

それはあなたの質問に完全には答えないかもしれませんが、次のパッケージはあなたが望むものに非常に似たものになります:https ://bitbucket.org/jpkotta/openwith/overview

基本的に、外部プログラム(okular、gimpなど)でファイルを開き、

「Unixではコマンドをnohupでラップするため、Emacsが終了しても起動されたプロセスは終了しません。」

実装の詳細はわかりませんが、コードを読んでみてください。私のために働きます。

于 2013-07-26T16:17:42.820 に答える