首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C中,如何在执行execvp()或类似调用时将stdin/stdout/stderr重定向到文件?

在C中,如何在执行execvp()或类似调用时将stdin/stdout/stderr重定向到文件?
EN

Stack Overflow用户
提问于 2013-01-27 09:13:29
回答 3查看 94.7K关注 0票数 24

我有以下代码:

代码语言:javascript
复制
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()调用的输入/输出仍然是控制台,而不是文件。很明显我做错了什么,正确的方法是什么呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-27 09:20:06

正确的方法是将文件描述符STDIN_FILENOSTDOUT_FILENOSTDERR_FILENO替换为使用dup2()打开的文件。然后,您还应该关闭子进程中的原始文件:

代码语言:javascript
复制
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 ...
}
票数 47
EN

Stack Overflow用户

发布于 2013-01-27 09:15:13

看一看freopen函数。

我不得不用stdout做一些类似的事情,并编写了两个函数来为我做这项工作:

代码语言:javascript
复制
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);
}
票数 11
EN

Stack Overflow用户

发布于 2017-03-10 21:21:20

当stdin、stdout、stderr为终端时,您可以使用它-

代码语言:javascript
复制
//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);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14543443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档