是突然看到
--
close(0); close(1); close(2);
if (!tty || !*tty) {
if (open("/dev/null", O_RDWR|O_NONBLOCK) >= 0)
dup(0), dup(0);
return;
}
--
這沒營養dup(0) 還作兩次,WHY?!
仔細想一下,突然讓人笑出來... 哈,果然不是那麼沒營養...
首先
1. FD的是Linux system 的資源且有限管理
2. FD每次打開都會被分配一個系統沒使用且又是最小的數字
3. 在 Shell fork 程式裡 0 1 2 預設都是打開的。就所有程式這三個預設都有開啦。
根據上面三原則!!! 這code 的動作就是把 這三個偷偷塞滿啦啦啦.......
這樣解釋太模糊了,先說用途。
如果你想要把 stdout 的資訊關掉,下一個 close(1); 就可以,但!!!如果想把他導去檔案呢?
總不能每個 printf 都一一修改吧。上面三原則剛好可以辦到
馬上動手幾行驗證:
---
int fd = open("/tmp/123", O_WRONLY);
close(1); // 關掉你個 stdout
printf("fd=%d\n", dup(fd)); // dup() 一個新的把 1 的位置塞掉
printf("bb\n"); //未來所有的 printf ....
---
查閱 /tmp/123
就會看到
#cat /tmp/123
fd=1
bb
哈... 得證。
話說... 這在重新寫 shell exec 或是 daemon 訊息重導還算常見 ..... 看過又忘記...
筆記人生... 筆記一下。
沒有留言:
張貼留言