[英]How to rollback redirected stdio in C?
從一些例子中,我知道如何將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回滾到標准輸入和輸出。
我該怎么做?
謝謝你的回復。
實際上,我遇到一個程序重定向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.