亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行dup和dup2函數的重定向與還原

發布時間:2021-10-14 14:36:05 來源:億速云 閱讀:177 作者:柒染 欄目:編程語言

今天就跟大家聊聊有關如何進行dup和dup2函數的重定向與還原,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

在說重點之前我們先來看看dup 和 dup2 函數的用法

dup 和 dup2 都是系統調用,都可以用來復制文件描述符

#include <unistd.h>

int dup(int oldfd);

復制一個老的文件描述符,返回新的文件描述符,且這兩個文件描述符共享同一個文件指針,指向同一個文件。

默認文件描述符返回的是沒有使用的且最小的。

int dup2(int oldfd, int newfd);

和dup 一樣, 只不過自己指定了新的文件描述符。

調用成功,返回新的文件描述符。

shell 中的重定向 “ < ”  (輸入)  和 “ > ”(輸出)就是用 dup 函數實現的。

我們來看一段代碼。

#include <stdio.h>

#include <unistd.h>

#include <sys/stat.h>

#include <fcntl.h>

int main(int argc, char *argv[ ])

{

        int oldfd;

       

        oldfd = open("a.txt", O_RDWR | O_CREAT | O_APPEND , 0666);    //打開文件

       if(old == -1)

       {

               printf("creation file failed\n");

               exit(-1);

       }

       else

       {

               dup2(oldfd , 1);      //

               printf("重定向成功\n");

        }

        close(oldfd);

    
        return 0;

}

       

運行結果是在a.txt 里面輸出“ 重定向成功 ” 這幾個字。

那么現在按照我們自己的理解來分析一下

一個文件描述符對應一個文件指針從而對應一個文件,首先文件描述符 1 對應輸出設備(默認為終端),而新創建的

a.txt 返回的文件描述符,我們假定滿足一定的條件為 3

所以我們記作:

1     -->     終端

3     -->     a.txt

當我們使用dup 以后結果

1     -->      a.txt

3     -->      a.txt  

可以看出 dup 函數說是復制一個文件描述符, 自己理解的花話也可以說成是替換了其中一個文件描述符的指向。1 原本指向終端,現在指向a.txt, 那么原本輸出到終端的內容不就輸出到a.txt了嗎。

這樣就完成了“ 重定向 ”功能。

問題出來了

按照上面的代碼,重定向完卻并沒有恢復,文件指針還是指向代碼中的a.txt,我們接著執行程序,輸出依然會在a.txt里面,除非你調用exit()或者其他的函數提前結束進程。

那么如果我們想還原呢?

首先我們要定義save_fd 用來保存我們將要覆蓋掉的終端的文件描述符

1     -->    終端

3     -->    a.txt

4     -->    終端      文件描述符4 為save_fd。

我們已經讓一個新的文件描述符指向了終端,那么接下來我們可以放心大膽的改變指向了。

1     -->    a.txt

3     -->    a.txt

4     -->    終端

在完成重定向以后

加上 dup2(save_fd, 1);

文件描述符 1 的指向變成了 save_fd 的指向,也就是還原到了最開始指向了終端,所以可以繼續在終端下輸出了。

1      -->   終端

3      -->   a.txt

接著我們關閉這個臨時“ 存儲器 ”。

close (save_fd);

這樣就完成了重定向外加恢復。

然而在實踐中我又出現了一些小問題

請看部分代碼

oldfd = open("a.txt", O_CREAT | O_APPEND | O_RDWR, 0666);   //打開文件

save_fd = dup(1);   //保存終端的文件描述符

dup2(oldfd ,1);       //重定向到a.txt

printf("重定向成功\n");

dup2(save_fd, 1);      //重定向到終端,也就是還原到終端

close(save_fd);    //關閉

然而我在輸出時,“ 重定向成功 ”這幾個字并沒有輸出到a.txt, 而是依然輸出到了屏幕上,

我覺得代碼和邏輯都不應該錯啊,最后找了一會發現了問題,我用write函數寫就能寫到 a.txt里面,用printf輸出卻輸出不到 a.txt 里面,最后我在printf()后面加了一個清空緩沖區函數fflush(stdout)就完美的解決了問題,這么說就是緩沖區的問題了,今天的重點也不是緩沖區,而且我也不是那么了解- - 。

我又做了實驗,將fflush(stdout)放到了printf()前面,輸出結果卻依然是不對的。

那么我大膽猜測:

當我們重定向完成后,輸出會輸出到a.txt也就是指定的文件里,然而printf()函數輸出是先到達緩沖區,我們也知道緩沖區是有大小的,所以也要等待緩沖區填滿才開始向外“ 拿 ”,然而在我這個例子中,還沒來得及從緩沖區取數據,重定向就復原了,所以依然輸出到了屏幕上。這也是我們需要小心謹慎的地方。

補充:dup也可以重定向到網絡的socket文件描述符,和管道

看完上述內容,你們對如何進行dup和dup2函數的重定向與還原有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

赣榆县| 孝感市| 光泽县| 耒阳市| 绥阳县| 汶上县| 静安区| 乌鲁木齐市| 黔东| 南部县| 大邑县| 文安县| 祥云县| 广汉市| 辉南县| 揭阳市| 勃利县| 宁夏| 龙门县| 汪清县| 揭西县| 浦东新区| 东平县| 营山县| 湘潭市| 嘉黎县| 民勤县| 大理市| 泸州市| 丹江口市| 象山县| 阳曲县| 彭州市| 长春市| 永和县| 惠水县| 清流县| 班戈县| 乌拉特前旗| 墨竹工卡县| 余江县|