2014年6月3日 星期二

[C code] dup() dup2() 奇妙的FD複製....

好吧...
是突然看到
--
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 訊息重導還算常見 ..... 看過又忘記...
筆記人生... 筆記一下。