在 C 语言中,当进行 execvp() 或类似调用时,如何将 stdin/stdout/stderr 重定向到文件?
- 2024-10-11 08:36:00
- admin 原创
- 228
问题描述:
我有以下代码:
pid_t pid = fork();
if (pid == -1)
{
// ...
}
else if (pid == 0)
{
stdin = someopenfile;
stdout = someotherfile;
stderr = somethirdopenfile;
execvp(args[0], args);
// handle error ...
}
else
{
// ...
}
问题是,调用的输入/输出execvp()
仍然是控制台,而不是文件。显然我做错了,正确的做法是什么?
解决方案 1:
正确的做法是使用 替换文件描述符STDIN_FILENO
、STDOUT_FILENO
和STDERR_FILENO
打开的文件dup2()
。然后还应该关闭子进程中的原始文件:
else if (pid == 0)
{
dup2(fileno(someopenfile), STDIN_FILENO);
dup2(fileno(someotherfile), STDOUT_FILENO);
dup2(fileno(somethirdopenfile), STDERR_FILENO);
fclose(someopenfile);
fclose(someotheropenfile);
fclose(somethirdopenfile);
execvp(args[0], args);
// handle error ...
}
解决方案 2:
看一下freopen
功能。
我必须做类似的事情stdout
,并编写了两个可以为我完成工作的函数:
static int fd;
static fpos_t pos;
void switchStdout(const char *newStream)
{
fflush(stdout);
fgetpos(stdout, &pos);
fd = dup(fileno(stdout));
freopen(newStream, "w", stdout);
}
void revertStdout()
{
fflush(stdout);
dup2(fd, fileno(stdout));
close(fd);
clearerr(stdout);
fsetpos(stdout, &pos);
}
解决方案 3:
当 stdin 、 stdout 、 stderr 为终端时,可以使用此功能。
//change stdin,stdout,stderr
freopen("new_stdin","r",stdin);
freopen("new_stdout","r",stdout);
freopen("new_stderr","r",stderr);
//----do something;
//reset stdin,stdout,stderr
freopen("/dev/tty","r",stdin);
freopen("/dev/tty","r",stdout);
freopen("/dev/tty","r",stderr);
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD