Mat*_*att 22 c unix linux exec io-redirection
我有以下代码:
pid_t pid = fork();
if (pid == -1)
{
// ...
}
else if (pid == 0)
{
stdin = someopenfile;
stdout = someotherfile;
stderr = somethirdopenfile;
execvp(args[0], args);
// handle error ...
}
else
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
问题是,execvp()调用的输入/输出仍然是控制台,而不是文件.显然,我做错了什么,做这件事的正确方法是什么?
caf*_*caf 44
正确的方法是替换文件描述符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 ...
}
Run Code Online (Sandbox Code Playgroud)
看看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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
78071 次 |
| 最近记录: |