恢复关闭的stdout后,printf可见

时间:2014-09-20 18:34:56

标签: c linux

我的目标是忽略区域中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,没有输出被重定向到屏幕,否则就是。

1 个答案:

答案 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;
}