gpt4 book ai didi

c++ - std::system 即使在父进程退出后也会执行吗?

转载 作者:太空狗 更新时间:2023-10-29 11:28:26 27 4
gpt4 key购买 nike

我在嵌入式 linux 环境中运行一个 C++ 控制台应用程序。我想像这样运行 std::system 命令。我以 tar 为例。

int main(int argc, char *argv[]) {
std::system("tar xvzf /path/to/some/file.tar.gz");
exit 0;
}

问题:
如果我像上面那样在 tar 命令后立即退出应用程序,tar 命令会继续执行吗?
我知道这在一定程度上取决于 tar 本身是如何实现的。但是可以说 tar 在父进程退出后不起作用(考虑最坏的情况),有没有办法我可以运行命令 std::system 在后台安全命令并退出我的应用程序,相信它会在我的应用程序或父进程退出后完成其工作?

最佳答案

system() 执行的命令通常不会在system() 返回后继续执行。 system() 启动一个新进程(使用 fork() + exec*()CreateProcess() 等),然后等待直到进程在返回之前完成。然而,如果该命令产生了孤儿,那么他们可能会继续生活。

根据 system() 使用的 SHELL,这可能会产生这种效果:

std::system("nohup tar xvzf /path/to/some/file.tar.gz &");

由于 system() 使用 shell(可能是 /bin/sh)启动命令,并且它反过来使用进程的当前环境(最值得注意的是 PATH 和可用于影响命令使用哪些共享库的变量) - 并且您还可以发送带有重定向的命令字符串,将命令放在后台(如上所示)等 - 通常被视为安全风险。将风险降至最低的一种方法是创建您自己的不使用 shell 或环境的系统函数。示例:

#include <iostream>
#include <array>
#include <type_traits> // std::common_type_t
#include <cstdlib> // std::exit
#include <utility> // std::forward

// fork, exec, waitpid
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

template<typename... Ts>
int mysystem(Ts&&... ts) {
int wstatus=-1;

pid_t pid = fork();

if(pid==0) { // in child process
std::array<std::common_type_t<Ts...>, sizeof...(ts) + 1> cmd{ std::forward<Ts>(ts)... };
execv(cmd[0], const_cast<char* const*>( cmd.data() ));
std::exit(1); // we'll only get here if execv failed starting the command

} else if(pid!=-1) { // in parent process
// wait for the child to terminate
// the exit status from the child will be returned in wstatus
waitpid(pid, &wstatus, 0); // 0 = wait forever

} // else { /* fork() failed */ }

return wstatus;
}

int main() {
//int ws = mysystem("/usr/bin/find", ".");
//int ws = mysystem("/usr/bin/bash", "-i");
int ws = mysystem("/usr/bin/tar", "xvzf", "/path/to/some/file.tar.gz");
std::cout << "--------------------\n"
"Exit status: " << WEXITSTATUS(ws) << "\n"
"Termination signal: " << WTERMSIG(ws) << "\n"
"Core dumped: " << std::boolalpha << WCOREDUMP(ws) << "\n";
}

关于c++ - std::system 即使在父进程退出后也会执行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54650077/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com