static int execute(int retofprev,int firstcmnd,int lastcmnd)
{
int pipeends[2];
pipe( pipeends );
processid = fork();
if (processid == 0) {
if (firstcmnd == 1 && lastcmnd == 0 && retofprev == 0) {
dup2( pipeends[1], STDOUT_FILENO );
} else if (firstcmnd == 0 && lastcmnd == 0 && retofprev != 0) {
dup2(retofprev, STDIN_FILENO);
dup2(pipeends[1], STDOUT_FILENO);
} else {
dup2( retofprev, STDIN_FILENO );
}
if (execvp( arrayofcmnds[0], arrayofcmnds) == -1)
{
printf("%s command not found\n",arrayofcmnds[0]);
cmndfailed=1;
}
}
commandlog();
if (retofprev != 0)
close(retofprev);
close(pipeends[1]);
if (lastcmnd == 1)
close(pipeends[0]);
return pipeends[0];
}
在这里,我也想将输出重定向到文件。但是我不知道如何进行。我尝试使用dup2,但是它仅将内容输出到文件,并且在屏幕上不显示任何内容。我希望输出既在屏幕上又在文件中。请帮助
更新:
static int execute(int retofprev,int firstcmnd,int lastcmnd)
{
int pipeends[2];
int oldstdout = dup(1);
pipe( pipeends );
processid = fork();
int file = open("output.log", O_RDWR | O_APPEND);
if (processid == 0) {
if (firstcmnd == 1) {
dup2( pipeends[1], STDOUT_FILENO );
} else if (lastcmnd == 0) {
dup2(retofprev, STDIN_FILENO);
dup2(pipeends[1], STDOUT_FILENO);
} else {
dup2( retofprev, STDIN_FILENO );
dup2(file,1);
}
if (execvp( arrayofcmnds[0], arrayofcmnds) == -1)
{
printf("%s command not found\n",arrayofcmnds[0]);
}
dup2(oldstdout,1);
fflush(stdout);
close(oldstdout);
}
return pipeends[0];
}
所以在这里,我尝试保存原始标准输出并进行了复制。我第一次连接文件,执行命令时,输出将输出到我想要的文件中。然后,我尝试将STDOUT_FILENO重定向到原始stdout,但此时我意识到输出不再可用,并且终端什么也不显示。 我知道tee可以解决问题,但是我在C中提到了tee的实现,但我对此并不了解。一点帮助将不胜感激。谢谢。