使用C ++

时间:2015-08-04 16:54:28

标签: c++ linux multithreading execve external-application

我需要执行仍在控制每个进程的进程。 我想创建一个存储线程或pid的类,或者创建一个必要的类。

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

我目前的方法是创建一个使用execve函数的线程。但是就我所见,线程会阻塞。

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

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

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

现在我的实际问题是,有更好的方法来管理"像c ++那样的外部应用程序?一些现成的解决方案(类,库)?如果不是,如果这是实际的方式我如何终止线程。使用终止呼叫被认为是不好的做法,这是我经常阅读的内容。

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

更新

到DBus&其它:

其他信息我没有写下我想要开始的所有流程! 所以它将用于启动第三方应用程序,即使我有代码,想要更改。

2 个答案:

答案 0 :(得分: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

更多信息是herekill()函数本身并不是一种不好的做法,如果你想快速而优雅地结束你可以在其中编写信号处理程序的子进程,但你应该使用类似的东西{ {3}}或dbus进行适当的进程间通信。你想告诉程序做一些事情,而不仅仅是让它死掉(通常是你想要它去做的事情)。

答案 1 :(得分:3)

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

fork-exec或更好的vfork-exec时的正确模式。从联机帮助页中提取:

vfork()系统调用可用于完全创建新进程      复制旧进程的地址空间,这在分页环境中极其低效。 fork(2)的用途很有用      本来可以为execve创建一个新的系统上下文(2)。该      vfork()系统调用与fork(2)的不同之处在于孩子借用了      父母的记忆和控制线程,直到调用execve(2)或者      退出(通过调用_exit(2)或异常)。父进程是      在孩子使用其资源时暂停。

稍后使用vforkexecve,您可以避免原始过程映像的副本,并且不会删除是否使用新进程,因此原始进程具有其子级和cat的pid控制它,查看它是否已经结束,发送信号等等。