我的目标是忽略区域中stdout和stderr的输出。 这是我的代码:
int stdOutCp = dup(STDOUT_FILENO);
int stdErrCp = dup(STDERR_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
printf("Works not\n");
dup2(stdOutCp, STDOUT_FILENO);
dup2(stdErrCp, STDERR_FILENO);
close(stdOutCp);
close(stdErrCp);
printf("This should be visible on the console\n");
如果我跳过dup2,没有输出被重定向到屏幕,否则就是。
答案 0 :(得分:1)
你是什么意思"忽略" ?
如果你想不再有stdout,你可以关闭它们。
但是,如果您不再拥有这些文件描述符(1和2),您可能会遇到-EBADF(错误文件描述符)。所以我建议在关闭stdout / stderr之后打开/ dev / null,这样它就会被定向到/ dev / null,而不是其他地方。
当然,它应该是您的计划完成的第一次开/关操作。
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h>
int main(int argc, char **argv)
{
fprintf (stdout, "test 0\n");
fprintf (stderr, "test 1\n");
close(1);
close(2);
/* Can be: assert(open("/dev/null", O_WRONLY) == 1); to control POSIX behavior. */
open("/dev/null", O_WRONLY);
/* Can be: assert(open("/dev/null", O_WRONLY) == 2); to control POSIX behavior. */
open("/dev/null", O_WRONLY);
fprintf (stdout, "test 2\n");
fprintf (stderr, "test 3\n");
return 0;
}
如果你只想暂时关闭stdout / stderr而不是永久关闭stdout / stderr你需要&#34;保存&#34; stdout / stderr的副本,并遵循与/ dev / null相同的指导原则。
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h>
int main(int argc, char **argv)
{
/* Should display something */
fprintf (stdout, "test 0\n");
fprintf (stderr, "test 1\n");
/* Saving filedescriptor 1 to filedescriptor 10 */
dup2(1,10);
/* Saving filedescriptor 2 to filedescriptor 20 */
dup2(2,20);
/* Should display something */
fprintf (stdout, "test 2\n");
fprintf (stderr, "test 3\n");
close(1);
close(2);
setvbuf(stdout, NULL, _IONBF, 0);
setvbuf(stderr, NULL, _IONBF, 0);
/* Can be: assert(open("/dev/null", O_WRONLY) == 1); to control POSIX behavior. */
open("/dev/null", O_WRONLY);
/* Can be: assert(open("/dev/null", O_WRONLY) == 2); to control POSIX behavior. */
open("/dev/null", O_WRONLY);
/* Should not display anything */
fprintf (stdout, "test 4\n");
fprintf (stderr, "test 5\n");
/* Restoring file descriptors */
dup2(10,1);
dup2(20,2);
/* Should display something */
fprintf (stdout, "test 6\n");
fprintf (stderr, "test 7\n");
return 0;
}