gpt4 book ai didi

c++ - execv 调用后打开文件句柄会发生什么情况? (C++)

转载 作者:太空宇宙 更新时间:2023-11-04 09:08:48 24 4
gpt4 key购买 nike

在 Linux 上,我有一些 C++ 代码,我想在其中执行另一个应用程序。该程序将一些数据输出到标准错误。因此,我通过使用 stderr 作为流参数调用 freopen() 来重定向 stderr。问题是,我想为另一个正在运行的进程重定向 stderr。

这是我正在处理的场景。我 fork() 当前进程;在子进程中,我重定向了 stderr;然后我执行 execv() 来运行单独的应用程序。

首先,我设置了一个 Sentry 来重定向 stderr 输出。这是代码:

class StderrSentry {
public:
StderrSentry() {
freopen( "NUL", "wt", stderr );
}
~StderrSentry() {
fclose( stderr );
}
};

然后在后面的代码中:

pid_t pid = fork();
int retval=-1;

if( pid < 0 ) {
success = false;
}
else if( ! pid ) { // child process
StderrSentry stdErrSentry; // REDIRECTING STDERR HERE!
pid_t chid = setsid();
if (chid == -1 ) {
exit(-1);
}
else {
// HERE IS THE execv() call:
if( execv(command[0].c_str(), const_cast<char**>(&c_args[0])) < 0 ) {
exit( -1 );
}
}
}
// ... else etc...

一旦 execv() 调用将当前进程替换为指定进程,stderr 重定向在技术上是否仍然有效?

这实际上是我想要的行为,但这是侥幸,还是这样做的方式?

我无法在 execv 中运行的应用程序中激活 stderr 重定向,因为它不是我的代码。

感谢您提供这方面的任何信息。

最佳答案

使用操作文件描述符(打开、关闭、dup2)的操作系统原语通常比使用 freopen 和 friend 做这种事情更安全,但是,是的,这应该是可行的,这就是 shell 管道的实现方式. execve 使所有 打开的文件保持打开状态,除非它们被标记为 F_CLOEXEC。

关于c++ - execv 调用后打开文件句柄会发生什么情况? (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3816051/

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