新聞中心
在Linux系統(tǒng)中,文件描述符是一種非常重要的概念,因?yàn)樗鼈兪枪芾砦募虸/O操作的基石。文件描述符是一個(gè)非負(fù)整數(shù),它代表著一個(gè)正在被打開(kāi)的文件句柄。在Linux中,所有的I/O操作都是通過(guò)文件描述符(FD)來(lái)完成的。本文將介紹如何使用Linux文件描述符(FD)來(lái)管理文件。

1. 打開(kāi)文件
在Linux中,打開(kāi)文件是通過(guò)系統(tǒng)調(diào)用open()函數(shù)來(lái)實(shí)現(xiàn)的。語(yǔ)法如下:
int open(const char *pathname, int flags);
其中,pathname是指文件的路徑名,flags是打開(kāi)文件的模式。open()函數(shù)返回一個(gè)文件描述符,可以用來(lái)進(jìn)行后續(xù)的I/O操作。例如,以下代碼打開(kāi)了一個(gè)名為test.txt的文件:
int fd = open(“test.txt”, O_CREAT | O_RDWR, 0644);
其中,O_CREAT和O_RDWR是文件打開(kāi)的模式,0644是新建文件的權(quán)限。
2. 寫(xiě)入文件
在Linux中,寫(xiě)入文件可以通過(guò)系統(tǒng)調(diào)用write()函數(shù)來(lái)實(shí)現(xiàn)。語(yǔ)法如下:
ssize_t write(int fd, const void *buf, size_t count);
其中,fd是文件描述符,buf是寫(xiě)入數(shù)據(jù)的指針,count是寫(xiě)入數(shù)據(jù)的字節(jié)數(shù)。以下是一個(gè)向test.txt寫(xiě)入字符串的例子:
char *str = “Hello, world!”;
write(fd, str, strlen(str));
3. 讀取文件
在Linux中,讀取文件可以通過(guò)系統(tǒng)調(diào)用read()函數(shù)來(lái)實(shí)現(xiàn)。語(yǔ)法如下:
ssize_t read(int fd, void *buf, size_t count);
其中,fd是文件描述符,buf是讀取數(shù)據(jù)的指針,count是讀取數(shù)據(jù)的字節(jié)數(shù)。以下是一個(gè)從test.txt讀取字符串的例子:
char buf[1024];
read(fd, buf, 1024);
4. 關(guān)閉文件
在Linux中,關(guān)閉文件可以通過(guò)系統(tǒng)調(diào)用close()函數(shù)來(lái)實(shí)現(xiàn)。語(yǔ)法如下:
int close(int fd);
其中,fd是要關(guān)閉的文件描述符。以下是一個(gè)關(guān)閉test.txt文件的例子:
close(fd);
5. 使用dup()和dup2()函數(shù)
dup()和dup2()函數(shù)可以用來(lái)復(fù)制文件描述符。dup()函數(shù)會(huì)返回一個(gè)新的文件描述符,它會(huì)指向與原來(lái)的文件描述符相同的文件。dup2()函數(shù)也會(huì)返回一個(gè)新的文件描述符,但它會(huì)把新的文件描述符指定為第二個(gè)參數(shù)傳遞的文件描述符,如果該文件描述符已經(jīng)存在,則會(huì)先關(guān)閉它。以下是一個(gè)使用dup()函數(shù)復(fù)制文件描述符的例子:
int newfd = dup(fd);
6. 使用fcntl()函數(shù)
fcntl()函數(shù)可以用來(lái)獲取和設(shè)置文件描述符的屬性。以下是一個(gè)設(shè)置文件描述符為非阻塞狀態(tài)的例子:
int flags = fcntl(fd, F_GETFL);
flags |= O_NONBLOCK;
fcntl(fd, F_SETFL, flags);
7. 使用mmap()函數(shù)
mmap()函數(shù)可以在用戶(hù)進(jìn)程的內(nèi)存地址空間中映射磁盤(pán)文件。這可以讓用戶(hù)進(jìn)程直接和磁盤(pán)文件進(jìn)行操作,而不必進(jìn)行讀取和寫(xiě)入操作。以下是一個(gè)將磁盤(pán)文件映射到用戶(hù)進(jìn)程內(nèi)存中的例子:
struct stat st;
fstat(fd, &st);
void *addr = mmap(NULL, st.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
在本文中,我們介紹了一些使用Linux文件描述符(FD)管理文件的方法。文件描述符是Linux中非常重要的概念,它是管理文件和I/O操作的基石。通過(guò)以上介紹,相信讀者們對(duì)使用文件描述符來(lái)管理文件有了一定的了解。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!
Linux下,fclose(fd)后,為什么沒(méi)有釋放內(nèi)存,直到把該文件從磁盤(pán)上刪除,使用內(nèi)存數(shù)才減去文件大???
fclose會(huì)將緩沖區(qū)數(shù)據(jù)寫(xiě)入做枯者磁盤(pán),但若磁盤(pán)已滿(mǎn),則fclose就會(huì)失敗,導(dǎo)致內(nèi)存沒(méi)有釋放。
判斷下fclose返回值是純薯不是EOF(-1),敗謹(jǐn)并檢查下是不是磁盤(pán)滿(mǎn)了。
Linux上的物理網(wǎng)卡與虛擬網(wǎng)絡(luò)設(shè)備
通過(guò) ip link add 可以創(chuàng)建多種類(lèi)型的虛擬網(wǎng)絡(luò)設(shè)備,在 man ip link 中可以得知有以下類(lèi)型的device:
Virtual Ethernet Port Aggregator。它是HP在虛擬化支持領(lǐng)域?qū)笴isco的VN-Tag的技術(shù)。
解決了虛擬機(jī)之間網(wǎng)絡(luò)通信的問(wèn)題,特別是位于同一個(gè)宿主機(jī)內(nèi)的虛擬機(jī)之間的網(wǎng)絡(luò)通信問(wèn)題。
VN-Tag在標(biāo)準(zhǔn)的協(xié)議頭中增加了一個(gè)全新的字段,VEPA則是通過(guò)修改網(wǎng)卡驅(qū)動(dòng)和交換機(jī),通過(guò)發(fā)夾彎技術(shù)回注報(bào)文。
TUN是Linux系統(tǒng)里的虛擬網(wǎng)絡(luò)設(shè)備,它的原理和使用在 Kernel Doc 和 Wiki 做了比較清楚的說(shuō)明。
TUN設(shè)備模擬網(wǎng)絡(luò)層設(shè)備(network layer),處理三層報(bào)文,IP報(bào)文等,用于將報(bào)文注入到網(wǎng)絡(luò)協(xié)議棧。
應(yīng)用程序(app)可以從物理網(wǎng)卡上讀寫(xiě)報(bào)文,經(jīng)過(guò)處理后通過(guò)TUN回送,或者從TUN讀取報(bào)文處理后經(jīng)物理網(wǎng)卡送出。
創(chuàng)建:
創(chuàng)建之后,使用 ip addr 就會(huì)看見(jiàn)一個(gè)名為”tun-default”的虛擬網(wǎng)卡
可以對(duì)tun-default設(shè)置IP:
使用open/write等文件操作函數(shù)從fd中進(jìn)行讀取操作,就是在收取報(bào)文,向fd中寫(xiě)入數(shù)據(jù),就是在發(fā)送報(bào)文。
TAP是Linux系統(tǒng)里的虛擬網(wǎng)絡(luò)設(shè)備,它的原理和使用在 Kernel Doc 和 Wiki 做了比較清楚的說(shuō)明。
不同于TUN的是,TAP設(shè)備模擬鏈路層設(shè)備(link layer),處理二層報(bào)文,以太網(wǎng)幀等。
TAP設(shè)備的創(chuàng)建過(guò)程和TUN類(lèi)似,在ioctl設(shè)置的時(shí)候,將類(lèi)型設(shè)置為IFF_TAP即可。
TAP設(shè)備與TUN設(shè)備的區(qū)別在于:
有時(shí)我們可能需要一塊物理網(wǎng)卡綁定多個(gè) IP 以及多個(gè) MAC 地址,雖然綁定多個(gè) IP 很容易,但是這些 IP 會(huì)共享物理網(wǎng)卡的 MAC 地址,可能無(wú)跡蠢頌法滿(mǎn)足我們的設(shè)計(jì)需求,所以有了 MACVLAN 設(shè)備,其工作方式如下:
MACVLAN 會(huì)根據(jù)收到包的目的 MAC 地址判斷這個(gè)包需要交給哪個(gè)虛擬網(wǎng)卡。單獨(dú)使用 MACVLAN 好像毫無(wú)意義,但是配合之前介紹的 network namespace 使用,我們可以構(gòu)建這樣的網(wǎng)絡(luò):
采摘
創(chuàng)建一個(gè)基于eth0的名為macv1的macvlan 網(wǎng)卡:
macvlan支持三種模式,bridge、vepa、private,在創(chuàng)建的時(shí)候設(shè)置“mode XXX”:
bridge模式,macvlan 網(wǎng)卡和物理網(wǎng)卡直接可以互通,類(lèi)似于接入到同一個(gè)bridge。
vepa模式下,兩個(gè)macvlan 網(wǎng)卡直接不能直接通信,必須通過(guò)外部的支持“發(fā)夾彎”交換機(jī)才能通信。
private模式下,macvlan發(fā)出的廣播包(arp等)被丟棄,即使接入了支持“發(fā)夾彎”的交換機(jī)也不能發(fā)現(xiàn)其它macvlan 網(wǎng)卡,除非手動(dòng)設(shè)置mac。
MACVTAP 是對(duì) MACVLAN的改進(jìn),把 MACVLAN 與 TAP 設(shè)備的特點(diǎn)綜合一下,使用 MACVLAN 的方式收發(fā)數(shù)據(jù)包,但是收到的包不交給 network stack 處理,而是生成一個(gè) /姿鄭dev/tapX 文件,交給這個(gè)文件:
由于 MACVLAN 是工作在 MAC 層的,所以 MACVTAP 也只能工檔凳作在 MAC 層,不會(huì)有 MACVTUN 這樣的設(shè)備。
ipvlan和macvlan的區(qū)別在于它在ip層進(jìn)行流量分離而不是基于mac地址,同屬于一塊宿主以太網(wǎng)卡的所有ipvlan虛擬網(wǎng)卡的mac地址都是一樣的。
veth設(shè)備是成對(duì)創(chuàng)建的:
創(chuàng)建之后,執(zhí)行 ip link 就可以看到新創(chuàng)建的veth設(shè)備:
注意veth設(shè)備前面的ID, 58: 和 59: ,一對(duì)veth設(shè)備的ID是相差1的,并且系統(tǒng)內(nèi)全局唯一??梢酝ㄟ^(guò)ID找到一個(gè)veth設(shè)備的對(duì)端。
veth設(shè)備理解
linux fd的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux fd,如何使用Linux文件描述符(FD)管理文件?,Linux下,fclose(fd)后,為什么沒(méi)有釋放內(nèi)存,直到把該文件從磁盤(pán)上刪除,使用內(nèi)存數(shù)才減去文件大???,Linux上的物理網(wǎng)卡與虛擬網(wǎng)絡(luò)設(shè)備的信息別忘了在本站進(jìn)行查找喔。
創(chuàng)新互聯(lián)(cdcxhl.com)提供穩(wěn)定的云服務(wù)器,香港云服務(wù)器,BGP云服務(wù)器,雙線(xiàn)云服務(wù)器,高防云服務(wù)器,成都云服務(wù)器,服務(wù)器托管。精選鉅惠,歡迎咨詢(xún):028-86922220。
文章名稱(chēng):如何使用Linux文件描述符(FD)管理文件?(linuxfd)
URL地址:http://m.fisionsoft.com.cn/article/dpdsiod.html


咨詢(xún)
建站咨詢(xún)
