莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          重定向和管道的實現

          Posted on 2008-02-29 11:16 dennis 閱讀(931) 評論(0)  編輯  收藏 所屬分類: linux & C
          重定向標準輸入的實現:
          1)close-then-open: close(0) ; fd=open("test",O_RDONLY); fd將是stdin。
          2)open-close-dup-close:
          fd=open(file),打開stdin將要重定向的文件;close(0);new_fd=dup(file);close(fd);new_fd就是被重定向的stdin
          3)open-dup2-close:
          fd=open(file);new_fd=dup2(fd,0);close(fd);

          重定向標準輸出的實現:
            父進程fork();子進程close(1);create("g",0644),此時子進程的stdout被重定向到g;接下來子進程exec某個程序,文件描述符屬于進程屬性,exec調用不會改變他們,那么運行的程序的標準輸出將被送到g,由此實現了標準輸出重定向。

          本質上重定向的實現是依賴兩個原則:
          1、標準輸入、標準輸出和標準錯誤分別是0、1和2
          2、最低可用描述符:打開文件時,為此文件安排的描述符總是進程內打開文件數組的最低可用位置的索引。

          管道:
            匿名管道:適合于有親緣關系的進程,通過pipe函數實現。
            有名管道:通過mkfifo函數實現,實現進程間的雙向通訊可以采用兩個有名管道實現,也可以采用socketpair調用。
          主站蜘蛛池模板: 象山县| 海丰县| 孟州市| 昭苏县| 广东省| 江西省| 莱西市| 阿合奇县| 长沙县| 东莞市| 外汇| 额济纳旗| 双鸭山市| 万年县| 逊克县| 渝中区| 开阳县| 曲松县| 万山特区| 临高县| 潞城市| 潞西市| 无为县| 花莲市| 韶关市| 衡水市| 赤水市| 缙云县| 西乡县| 新密市| 华阴市| 咸丰县| 宜良县| 新丰县| 龙里县| 宕昌县| 扎兰屯市| 周宁县| 邹平县| 肥城市| 平塘县|