最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux文件系統(tǒng)之重定向的實現(xiàn)原理詳解

 更新時間:2024年02月21日 09:42:17   作者:春人.  
在Linux中,重定向是一種用于控制輸入和輸出流的機(jī)制,通過重定向,可以將命令的輸入和輸出重定向到文件、設(shè)備或其他命令中,本文將詳細(xì)的給大家講解一下Linux重定向的實現(xiàn)原理,需要的朋友可以參考下

一、再來理解重定向

1.1 輸出重定向效果演示

在這里插入圖片描述

分析ls 指令是顯示當(dāng)前目錄下的文件,本質(zhì)就是將當(dāng)前目錄下所有的文件名以字符串的形式寫入到顯示器文件。采用輸出重定向 >,將原本應(yīng)該寫入顯示器文件的內(nèi)容寫入到了 log.txtx 文件中。

1.2 重定向的原理

在講解重定向原理前,我們需要明確文件描述符的分配規(guī)則,即從0下標(biāo)開始,尋找最小的沒有使用的數(shù)組位置,它的下標(biāo)就是新打開文件的文件描述符。這里沒有使用的意思是該下標(biāo)里面存的是 NULL,即沒有指向任何一個文件對象。下面通過一段代碼來為大家展示重定向的原理。

// mytest.c
int main()
{
    close(1);
    int fd = open(FILE_PATH, O_WRONLY | O_CREAT | O_TRUNC, 0666);
    if(fd < 0)
    {
        perror("open");
        return errno;
    }

    const char* str = "Hello Linux!\n";
    int cnt = 5;
    while(cnt--)
    {
        write(1, str, strlen(str));
    }
    return 0;
}

代碼分析:上面這段代碼就完美的展示了重定向的原理。首先調(diào)用 close 系統(tǒng)調(diào)用將 1 號下標(biāo)對應(yīng)的文件關(guān)閉,關(guān)閉的意思就是將 1 下標(biāo)里的內(nèi)容置為 NULL,原本 1 下標(biāo)里面存儲的內(nèi)容是顯示器文件對象的地址,也就是標(biāo)準(zhǔn)輸出 stdout,緊接著調(diào)用 open 打開了一個文件,根據(jù)文件描述符的分配規(guī)則,新打開的這個文件的文件描述符就是 1,即文件描述符表(file*的數(shù)組)1 號下標(biāo)里面存儲的就是新打開的文件對象的地址。接下來調(diào)用 write 接口,向 1 號文件描述符中進(jìn)行寫入,本來 1 號文件描述符對應(yīng)的是顯示器文件,原本向顯示器文件中寫入的內(nèi)容,此時就被寫入到新打開的文件中,沒有向顯示器文件中寫入,因此屏幕上就不會出現(xiàn)字符串,至此整個重定向的過程就結(jié)束啦。

在這里插入圖片描述

總結(jié):重定向的本質(zhì)是對數(shù)組下標(biāo)里面的內(nèi)容進(jìn)行修改。

在這里插入圖片描述

1.3 dup2

上面介紹了重定向的原理,下面介紹一下實現(xiàn)重定向的系統(tǒng)調(diào)用 dup2。

#include <unistd.h>
int dup2(int oldfd, int newfd);

dup2 的具體實現(xiàn)并不是向上面代碼中那樣,先將一個文件描述符關(guān)閉,然后緊接著再打開一個文件。dup2 的使用方法是,用戶在調(diào)用 dup2 接口前,正常打開一個文件,不用將顯示器文件關(guān)閉,此時新打開文件的文件描述符就是 3。接下來調(diào)用 dup2 ,將新打開文件的文件描述符作為 oldfd,將顯示器文件的文件描述符也就是 1,作為 newfd。我們知道,文件描述符本質(zhì)上就是數(shù)組下標(biāo),dup2 函數(shù)中執(zhí)行的工作就是將 oldfd 下標(biāo)里存儲的文件對象地址拷貝到 newfd 下標(biāo)里面,至此重定向工作就完成了。

在這里插入圖片描述

小Tipsdup2 的函數(shù)形參有一個誤導(dǎo),我們可能會覺得新打開文件的描述符是 newfd,其實不然,這里的 newfd 是將要被覆蓋的文件描述符,oldfd 是新打開文件的描述符。

int main()
{
    // close(1);
    int fd = open(FILE_PATH, O_WRONLY | O_CREAT | O_TRUNC, 0666);
    if(fd < 0)
    {
        perror("open");
        return errno;
    }
    dup2(fd, 1);
    const char* str = "Hello Linux!\n";
    int cnt = 5;
    while(cnt--)
    {
        write(1, str, strlen(str));
    }
    return 0;
}

在這里插入圖片描述

代碼分析:上面就是輸出重定向的實現(xiàn)原理,追加重定向只需要把 O_TRUNC 替換成 O_APPEND。

1.4 輸入重定向效果演示

在這里插入圖片描述

分析cat 指令本來是從鍵盤文件中獲取輸入然后寫入顯示器文件中,采用輸入重定向 < 后,是從 log.txt 文件中獲取輸入然后寫入顯示器文件中。

1.5 輸入重定向代碼實現(xiàn)

// 輸入重定向
int main()
{
    int fd = open(FILE_PATH, O_RDONLY);
    if(fd < 0)
    {
        perror("open");
    }
    dup2(fd, 0);

    char str[1024];
    ssize_t ret = read(fd, str, sizeof(str) - 1);
    if(ret > 0)
    {
        str[ret] = '\0';
        printf("echo: %s", str);
    }
    return 0;
}

在這里插入圖片描述

小Tips:進(jìn)程歷史打開的文件與進(jìn)行的各種重定向關(guān)系都和未來進(jìn)行的程序替換無關(guān),程序替換并不影響文件訪問。進(jìn)程打開文件和何種重定向工作,本質(zhì)上都是進(jìn)程管理的模塊,而程序替換只會把用戶空間的代碼和數(shù)據(jù)完全被新程序替換,不會影響到進(jìn)程管理。

二、再來理解標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤

int main()
{
    fprintf(stdout, "Standard output messages\n");
    fprintf(stdout, "Standard output messages\n");
    fprintf(stdout, "Standard output messages\n");

    fprintf(stderr, "Standard error messages\n");
    fprintf(stderr, "Standard error messages\n");
    fprintf(stderr, "Standard error messages\n");
    return 0;
}

在這里插入圖片描述

代碼分析> 是輸出重定向,也就是對標(biāo)準(zhǔn)輸出(1號文件描述符)進(jìn)行重定向。標(biāo)準(zhǔn)錯誤對應(yīng)的2號文件描述符并沒有進(jìn)行重定向,因此標(biāo)準(zhǔn)錯誤消息仍然打印在了屏幕上。

2.1 同時對標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤進(jìn)行重定向

./mytest 1>output.txt 2>error.txt

小Tips:這段代碼就是將1號文件描述符對應(yīng)的標(biāo)準(zhǔn)輸出文件重定向到 output.txt 文件,將2號文件描述符對應(yīng)的標(biāo)準(zhǔn)錯誤文件重定向到 error.txt 文件。這樣以來屏幕上就不會有任何輸出。

在這里插入圖片描述

2.2 將標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤重定向到同一個文件

./mytest 1>all.txt 2>&1

在這里插入圖片描述

小Tips:將標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤都重定向到 all.txt 文件中。

三、再看一切皆文件

所有操作計算機(jī)的動作,都是通過進(jìn)程去執(zhí)行的,所有的訪問文件操作,都是通過進(jìn)程去實現(xiàn)的,目前所有對文件的操作都依賴于進(jìn)程。

在這里插入圖片描述

小Tips:所有的外設(shè)都被抽象成了文件,每個外設(shè)都有自己的讀寫方法,不同的外設(shè)讀寫方法一定是不同的。但是我們在對文件進(jìn)行讀寫操作的時候,始終調(diào)用的都是 readwrite 方法,這是因為操作系統(tǒng)為我們提供了一個方法集類型 file_operations,該結(jié)構(gòu)體里面都是函數(shù)指針類型,指向外設(shè)的各種方法,這就是多態(tài)的雛形。所謂的一切皆文件,就是操作系統(tǒng)幫我們封裝了一層文件對象,進(jìn)程對各種外設(shè)的操作,全都變成了對文件的操作。

sszie_t read(int fd)
{
	task_struct->files->fd_array[fd]->f_op->read();
}

四、結(jié)語

以上就是Linux文件系統(tǒng)之重定向的實現(xiàn)原理詳解的詳細(xì)內(nèi)容,更多關(guān)于Linux重定向的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

呼玛县| 威远县| 望江县| 班戈县| 宜阳县| 洪江市| 郸城县| 行唐县| 岗巴县| 股票| 金川县| 古田县| 左权县| 株洲市| 闻喜县| 星子县| 伊宁市| 伊宁市| 石柱| 兴义市| 施秉县| 皮山县| 泰来县| 承德县| 桑植县| 临高县| 叶城县| 青浦区| 宜章县| 汉川市| 惠东县| 文昌市| 宁波市| 板桥市| 印江| 拜城县| 宁津县| 百色市| 田东县| 石河子市| 旅游|