日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Linuxunlink函數(shù)和刪除文件的操作方法

1. unlink函數(shù)

目前成都創(chuàng)新互聯(lián)公司已為上千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、綿陽服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、天等網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

??對于硬鏈接來說,unlink 用來刪除目錄項(xiàng),并把 inode 引用計(jì)數(shù)減 1,這兩步也是一個原子過程。直到 inode 引用計(jì)數(shù)為 0,才會真正刪除文件。

??對于軟鏈接來說,unlink 直接刪除軟鏈接,而不影響軟鏈接指向的文件。

函數(shù)原型:

int unlink(const char *pathname);  

參數(shù)說明:

??pathname:指定要移除的鏈接文件

返回值說明:

??成功返回0;失敗則返回-1,同時設(shè)置errno為相應(yīng)值

2. 實(shí)驗(yàn)代碼—myunlink

#include
#include
#include
int main(int argc, char *argv[]){
//為一個已經(jīng)存在的文件創(chuàng)建目錄項(xiàng)(硬鏈接)
if(link(argv[1], argv[2]) == -1){
perror(“l(fā)ink error”);
exit(1);
}
//刪除之前的文件目錄項(xiàng)
if(unlink(argv[1]) == -1){
perror(“unlink error”);
exit(1);
}
return 0;
}

??當(dāng)我們執(zhí)行./myunlink hellotest命令完后,會刪除 hellotest,同時 inode 引用計(jì)數(shù)減 1。

3. 刪除文件

??不用說,相信大家都用過rm -rf命令吧。

??現(xiàn)在我們再來思考一下,以前我們通過rm命令刪除文件時你有沒有質(zhì)疑過,文件真的被刪除掉了嗎?

??如果真的刪除的了話,那么操作系統(tǒng)又是怎么把文件刪除掉的?

??操作系統(tǒng)在設(shè)計(jì)的時候是通過把文件的inode索引號與磁盤中的block塊建立了關(guān)聯(lián),這樣我們通過文件找到block塊的位置,也就看到了文件的數(shù)據(jù)了。

??在刪除文件時,是由系統(tǒng)的2個變量來控制的一個是i_link,表示文件的硬鏈接數(shù)量,另一個是i_count,表示文件的引用計(jì)數(shù),文件刪除的必需條件就是i_link = 0和i_count = 0。

??在磁盤中的文件只要把i_link = 0(硬鏈接數(shù)干掉)就可以把文件刪除了,如果這個文件在程序中被打開,我們還需要把運(yùn)行的程序干掉 i_count = 0,這樣才能達(dá)到刪除文件的目的。

4. linux下刪除文件的大概過程

??linux下文件刪除過程大概如圖:

圖1-linux下文件刪除的大概過程

??當(dāng)前磁盤中的/test/file目錄下有一個test文件(i_link = 1),還有一個硬鏈接文件hard_link指向test文件(i_link = 1),且./test進(jìn)程又打開了test文件(i_count = 1),如果要刪除test.txt文件,必須把./test進(jìn)程干掉(i_count = 0),然后刪除hard_link硬鏈接文件和/test/file目錄下的test.txt文件(也就是讓i_link = 0)。

??也就是說linux下是通過link的數(shù)量來控制文件刪除的,當(dāng)一個文件的link = 0時,這個文件才會被刪除。一般一個文件有2個link計(jì)數(shù)器,一個是i_link和i_count。

??i_count是當(dāng)前進(jìn)程打開文件的引用計(jì)數(shù),i_link是文件鏈接的數(shù)量,可以把i_count理解為內(nèi)存中文件的計(jì)數(shù)器,而i_link是磁盤中的計(jì)數(shù)器。對于rm命令來說實(shí)際就是設(shè)置磁盤中文件的i_link計(jì)數(shù)為0。如果一個文件被進(jìn)程所使用,而用戶又執(zhí)行了rm命令把文件刪除掉了,此時程序還能正常執(zhí)行,依舊能從文件中讀取正確的數(shù)據(jù),這是因?yàn)閞m命令只是把i_link設(shè)置為 0(是將文件到inode的關(guān)聯(lián)斷開,并沒有刪除掉inode與磁盤中的block數(shù)據(jù)塊,此時停止進(jìn)程,被刪除的數(shù)據(jù)可以找回來,如果進(jìn)程正在寫入數(shù)據(jù),那么磁盤的block塊的數(shù)據(jù)會被進(jìn)程寫入的數(shù)據(jù)覆蓋掉,原先的數(shù)據(jù)就恢復(fù)不了了)。

??而進(jìn)程仍然在引用該文件i_count = 1,執(zhí)行rm命令系統(tǒng)并不會真正的刪除該文件,如果要刪除該文件必須讓進(jìn)程解除對該文件的引用計(jì)數(shù),也就是把進(jìn)程干掉,這樣文件才會被真正的刪除掉。

??即便如此,文件真的被刪除了嗎?前面我們說過文件的數(shù)據(jù)是存儲在磁盤上block塊中,當(dāng)我們要查找文件當(dāng)中的數(shù)據(jù)時并不是直接找到磁盤上的block塊,因?yàn)榇疟P上的block塊實(shí)在是太多了,你怎么就知道你的數(shù)據(jù)存儲在哪個block塊中?

??假設(shè)你一不小心把非常重要的數(shù)據(jù)刪除掉了,這將意味著你的數(shù)據(jù)就永遠(yuǎn)也找不回來了,從而造成無法挽回的損失了,由此可見數(shù)據(jù)的重要性,因此操作系統(tǒng)不會輕易把數(shù)據(jù)從磁盤中真正的刪除掉。

??看到這里,相信你已經(jīng)明白了,實(shí)際上你所謂的右鍵刪除操作只是把文件的inode索引號與磁盤中的block的關(guān)聯(lián)斷開了而已,但文件的數(shù)據(jù)并沒有真正的被刪除掉。如果你想真的刪除數(shù)據(jù)的話,要么把磁盤格式化,要么把原先的數(shù)據(jù)刪除掉,然后寫入新的數(shù)據(jù)覆蓋掉,當(dāng)然,你也可以選擇格式化和數(shù)據(jù)覆蓋雙重保險(xiǎn),這個時候你的數(shù)據(jù)想要恢復(fù)基本上是非常困難的,即便可以頂多只能恢復(fù)一部分?jǐn)?shù)據(jù)了吧。

??如果你真的一不小心刪除了很重要的數(shù)據(jù)的話,這個時候趕緊恢復(fù)數(shù)據(jù),其他的任何多余的操作盡量不要做,這樣在數(shù)據(jù)恢復(fù)過程中才能盡量減少數(shù)據(jù)丟失。

5. myunlink2.c程序

#include
#include
#include
#include
#include
/*
unlink函數(shù)是刪除一個dentry
*/
int main(void){
int fd;
char *p = “test of unlink\n”;
char *p2 = “after write something.\n”;
//當(dāng)進(jìn)程打開temp.txt文件時,引用計(jì)數(shù)會+1
fd = open(“temp.txt”, O_RDWR|O_CREAT|O_TRUNC, 0644);
if(fd < 0){
perror(“open temp error”);
exit(1);
}
//具備了被釋放的條件
int ret = unlink(“temp.txt”);
if(ret < 0){
perror(“unlink error”);
exit(1);
}
//向temp.txt文件寫入第一個字符串,通過返回值判斷寫操作是否成功
ret = write(fd, p, strlen(p));
if (ret == -1) {
perror(“—–write error”);
}
printf(“hi! I’m printf\n”);
//向temp.txt文件寫入第二個字符串,通過返回值判斷寫操作是否成功
ret = write(fd, p2, strlen(p2));
if (ret == -1) {
perror(“—–write error”);
}
printf(“Enter anykey continue\n”);
getchar();
//當(dāng)close關(guān)閉fd的時候,進(jìn)程對文件的引用計(jì)數(shù)就會-1,斷開進(jìn)程與文件的關(guān)聯(lián)關(guān)系
close(fd);
return 0;
}

程序運(yùn)行結(jié)果:

??程序的運(yùn)行結(jié)果和我們所預(yù)料的一樣,當(dāng)程序運(yùn)行的時候,調(diào)用open函數(shù)創(chuàng)建并打開了temp.txt文件,此時進(jìn)程對temp文件的引用計(jì)數(shù)i_count會加1,同時temp文件本身也會有一個i_link鏈接計(jì)數(shù)也會加1。

??當(dāng)調(diào)用了unlink函數(shù)刪除temp文件時,只是把i_link鏈接計(jì)數(shù)減1,而進(jìn)程的i_count計(jì)數(shù)還是1,并沒有斷開與temp文件的關(guān)聯(lián)關(guān)系,因此進(jìn)程可以調(diào)用write函數(shù)往temp文件里面寫數(shù)據(jù),自然也就能成功了。當(dāng)程序運(yùn)行結(jié)束后,調(diào)用close關(guān)閉對temp文件的引用,此時temp文件就會被操作系統(tǒng)刪除掉。

6. 總結(jié)

??在不了解文件系統(tǒng)原理的情況下,通常我們會認(rèn)為數(shù)據(jù)已經(jīng)刪除掉,其實(shí)不然,磁盤上的文件數(shù)據(jù)還在,只是把dentry目錄和磁盤上的數(shù)據(jù)的聯(lián)系斷開,我們找不到數(shù)據(jù)肯定會認(rèn)為刪掉了,但是只要我們想辦法讓數(shù)據(jù)和dentry目錄之間重新建立連接,就可以讓刪除的數(shù)據(jù)恢復(fù)。

??因此我們刪除文件,從某種意義上說,只是讓文件具備了被釋放的條件,至于什么時候釋放這取決于操作系統(tǒng)。

??對于unlink函數(shù)來說,清除文件時,如果文件的硬鏈接數(shù)到0了,沒有dentry對應(yīng),但該文件仍不會馬上被釋放。要等到所有打開該文件的進(jìn)程關(guān)閉該文件,系統(tǒng)才會挑時間將該文件釋放掉。

7. 不要隨便使用rm命令

??相信看到這里,你應(yīng)該知道了,數(shù)據(jù)對于計(jì)算機(jī)的重要性了,因?yàn)橐坏┠承┲陵P(guān)重要的數(shù)據(jù)刪除了,那就真的永遠(yuǎn)沒了,這也是操作系統(tǒng)為什么不直接將數(shù)據(jù)從磁盤中刪除的原因。但也不要因?yàn)檫@樣,你就可以肆無忌憚的使用rm命令了,因?yàn)橛袝r候數(shù)據(jù)刪除了,并不能百分百的恢復(fù)回來。

總結(jié)

以上所述是小編給大家介紹的Linux unlink函數(shù)和刪除文件的操作方法,希望對大家有所幫助,也非常感謝大家對網(wǎng)站的支持!

創(chuàng)新互聯(lián)服務(wù)器托管擁有成都T3+級標(biāo)準(zhǔn)機(jī)房資源,具備完善的安防設(shè)施、三線及BGP網(wǎng)絡(luò)接入帶寬達(dá)10T,機(jī)柜接入千兆交換機(jī),能夠有效保證服務(wù)器托管業(yè)務(wù)安全、可靠、穩(wěn)定、高效運(yùn)行;創(chuàng)新互聯(lián)專注于成都服務(wù)器托管租用十余年,得到成都等地區(qū)行業(yè)客戶的一致認(rèn)可。


名稱欄目:Linuxunlink函數(shù)和刪除文件的操作方法
網(wǎng)站URL:http://www.5511xx.com/article/dhpccec.html