輸入市怎、輸出是在主存和外部設(shè)備之間復(fù)制數(shù)據(jù)的過(guò)程。
Unix I/O
一個(gè)Linux 文件就是一個(gè)m個(gè)字節(jié)的序列区匠。所有的I/O設(shè)備都被模型化為文件,所有的輸入和輸出都被當(dāng)做對(duì)應(yīng)文件的讀和寫(xiě)來(lái)執(zhí)行驰弄。這種將設(shè)備映射為文件的方式麻汰,使得Linux內(nèi)核引出一個(gè)簡(jiǎn)單戚篙、低級(jí)的應(yīng)用接口,稱為Unix I/O岔擂。文件種類:
普通文件,目錄乱灵,套接字、命名管道阔蛉、符號(hào)鏈接、字符和塊設(shè)備状原。文件共享:
描述符表:每個(gè)進(jìn)程都有一個(gè)描述符表。里面記錄了進(jìn)程打開(kāi)的文件描述符颠区。指向文件表中的一個(gè)表項(xiàng)。
文件表:每個(gè)文件表的表項(xiàng)包括當(dāng)前的文件位置毕莱、引用計(jì)數(shù)等,以及指向v-node表中對(duì)應(yīng)表項(xiàng)的指針朋截。
v-node表:所有進(jìn)程共享,包括stat結(jié)構(gòu)中的大多數(shù)信息部服,即文件的元數(shù)據(jù),如st_mode和st_size成員廓八。I/O重定向
int dup2(int oldfd, int newfd);
表示復(fù)制描述符表項(xiàng)oldfd到新描述符表項(xiàng)newfd,覆蓋描述符表項(xiàng)newfd以前的內(nèi)容剧蹂。如果newfd已經(jīng)打開(kāi)了,則dup2會(huì)在復(fù)制oldfd之前關(guān)閉newfd宠叼。
即原本newfd指向A,則復(fù)制之后newfd也指向oldfd所指向的文件表項(xiàng)。所以之后對(duì)newfd的IO都重定向到了oldfd醋闭。