【问题标题】:Start process in emacs lisp that continues after lisp program ends在 lisp 程序结束后继续的 emacs lisp 中的启动进程
【发布时间】:2013-07-27 00:17:42
【问题描述】:

如何在 emacs lisp 程序结束后启动一个将继续运行的进程?我正在编写一个实用程序脚本,它应该启动一个交互式 GUI 程序并退出。

提前致谢。

编辑:我想我正在寻找与此 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;
}

【问题讨论】:

    标签: emacs elisp


    【解决方案1】:

    它可能无法完全回答您的问题,但以下软件包与您想要的非常相似:https://bitbucket.org/jpkotta/openwith/overview

    它基本上是用外部程序(如okular、gimp...)打开一个文件和

    "在 Unix 上将命令包装在 nohup 中,因此如果 Emacs 退出,启动的进程将不会退出。"

    我不知道它的实现细节,但你可以尝试阅读他们的代码。对我有用。

    【讨论】:

      【解决方案2】:

      据我所知,没有任何方法可以防止 Emacs 在退出时终止其子进程,无论是同步的、异步的还是通过 shell-command 执行的。如果您使用任何 Emacs 原语来执行子进程(即 start-processcall-process 及其变体)并尝试在进程完成之前退出 Emacs,Emacs 总是会提示您杀死它们或杀死它们如果您为每个所述进程将process-query-on-exit-flag 设置为nil,则自动设置。尝试使用某种基于 shell 的hackery 涉及shell-commandbash 内置函数,如bgdisownsetsid 等是没有意义的,因为shell-command 最终会调用上述start-processcall-process 原语。

      顺便说一句,我认为 ELisp 是一个非常糟糕的脚本选择(如果您的脚本不是完全用 ELisp 编写的,那么我无法理解为什么您需要从 Emacs 本身执行您的子进程)。您可能会考虑的一种可能性是将 Emacs 作为守护程序启动(它会自动将 Emacs 从控制终端分离并启动emacsclient 可以与之通信的服务器进程)并使用emacsclient -e 向它发出命令。我不知道这是否适用,但它可能有用。

      您还没有真正提供有关您的脚本的任何细节,因此目前很难提供任何进一步的具体建议。我会这样说:明智的做法是在bash 中编写需要独立于Emacs 运行的脚本部分,并使用它的作业控制机制(即运行后台进程和disown 它等) .),或者其他一些脚本语言,比如 Perl(我相信它明确地有自己的 fork() 函数)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-10
        • 1970-01-01
        相关资源
        最近更新 更多