1

我需要在控制每个进程的情况下执行进程。我想创建一个存储线程或 pid 或任何必要的类。

我目前有一个程序,它使用 C 函数 execvp 执行一个外部应用程序,并从 shell 脚本加载环境。所以我目前的程序是阻塞的。但我需要能够让它自由运行,并且只有在我终止当前运行或启动新的外部应用程序时。

我目前的方法是创建一个使用 execve 函数的线程。但是,据我所知,线程将被阻塞。

可能在线程中的代码(然后带有变量):

char *argv[] = { "/bin/bash", "-c", "myApplication", 0 };
execve(argv[0], &argv[0], environment.data());

调用的应用程序可能在代码中不固定,它们的名称将由外部设置文件给出,包括参数。

现在我的实际问题是,有没有更好的方法来“管理”像 c++ 这样的外部应用程序?一些现成的解决方案(类,库)?如果不是,如果这是实际方式,我该如何终止线程。据说使用终止调用是不好的做法,这就是我经常阅读的内容。

我希望这对于论坛来说已经足够具体了,因为我不知道如何再具体了。如果您需要更多提示我想在这里创建什么,请随时在评论中提问。

更新

到 DBus 和其他:

附加信息 我没有写所有我想启动的进程!所以它将用于启动 3rd 方应用程序,即使我有代码,也不想更改。

4

2 回答 2

3

切勿execv在线程中使用函数,因为 execve() 系统调用会用新的进程映像覆盖当前进程映像。

如果是 fork-exec 或更好的 vfork-exec,则为正确模式。从手册页中提取:

vfork() 系统调用可用于创建新进程,而无需完全复制旧进程的地址空间,这在分页环境中效率极低。当 fork(2) 的目的是为 execve(2) 创建新的系统上下文时,它很有用。vfork() 系统调用与 fork(2) 的不同之处在于子进程借用父进程的内存和控制线程,直到调用 execve(2) 或退出(通过调用 _exit(2) 或异常)。父进程在子进程使用其资源时被挂起。

使用vforkshortly after with execve,可以避免原始进程映像的副本,并且不要擦除新进程,因此原始进程有其子进程的pid,cat控制它,看看它是否已经结束,发送信号和很快。

于 2015-08-05T09:03:15.203 回答
3

你想fork()在你执行之前。fork()是一个函数,它创建一个与作为子进程运行的原始调用者相同的新进程。fork()不同之处在于父进程获取子进程的 pid 作为返回值,而子进程获取 0。您想要做的要点是:

pid_t pid = fork();

if( pid == 0 )
{
    // we're the child process
    char *argv[] = { "/bin/bash", "-c", "myApplication", 0 };
    int rc = execve(argv[0], &argv[0], environment.data());
    // execve only returns if there was an error
    // check 'errno' and handle it here
}
else if ( pid < 0 )
{
    // pid is less than zero, we didn't successfully fork,
    // there is no child process.
    throw "error message";
}

// do whatever processing the parent does

更多信息在这里。该kill()函数本身并不是不好的做法,如果您想快速而优雅地结束子进程,您可以在其中编写信号处理程序,但您应该使用dbuszeromq 之类的东西来进行正确的进程间通信。你想告诉程序做某事,而不仅仅是告诉它死(通常是你想要它做的事情,如果你正在杀死它)。

于 2015-08-04T19:20:16.027 回答