簡體   English   中英

如何在C中回滾重定向的stdio?

[英]How to rollback redirected stdio in C?

第1輪

從一些例子中,我知道如何將stdio重定向到null。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
    int fd = open("/dev/null", O_RDWR);
    int in, out, err;

    if (fd < 0) {
        perror("open file error!");

        return -1;
    }

    printf("test1\n");

    dup2(fd, STDIN_FILENO);
    dup2(fd, STDOUT_FILENO);
    dup2(fd, STDERR_FILENO);

    printf("test2\n");

    close(fd);

    return 0;
}

執行代碼后,我的控制台顯示:

test1

test2被重定向到/ dev / null。

但是,現在,我想將/ dev / null中的stdio回滾到標准輸入和輸出。

我該怎么做?

第2輪

謝謝你的回復。

實際上,我遇到一個程序重定向stdio(例如示例1)並分叉我的程序(例如示例2)的問題。

例1
 #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main() { int fd = open("/dev/null", O_RDWR); if (fd < 0) { perror("open file error!"); return -1; } printf("test1\\n"); dup2(fd, STDIN_FILENO); dup2(fd, STDOUT_FILENO); dup2(fd, STDERR_FILENO); execl("hello_world", NULL); close(fd); return 0; } 
例2
 #include <stdio.h> int main() { printf("Hello World!\\n"); return 0; } 

運行示例1后,我的控制台顯示:

 test1 

如何更改示例2以將printf()重定向到控制台? 謝謝。

一個簡單的解決方案是使用dup保存初始文件描述符(您不應該假設它們是相同的),然后使用dup2稍后恢復它們。

如果你有一個控制終端( /dev/null慣用法建議),你應該能夠將輸出重定向到/dev/tty

但是你應該知道真正的守護進程,比如從cron啟動的進程沒有控制終端,在這種情況下, /dev/tty不會被定義。

對於你的round2問題,exec調用和類似的保存打開文件描述符,這意味着你需要在調用execl之前還原你所做的事情,請參閱以下有關如何保存/恢復它們的示例: 重新打開stdout和stdin文件描述符之后關閉他們

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM