第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何檢測已刪除的文件?

如何檢測已刪除的文件?

Go
PIPIONE 2023-05-08 14:57:53
寫入不存在的文件不會在 Go 中產(chǎn)生錯誤。例如,這是一個循環(huán)寫入文件的示例程序:package mainimport (    "log"    "os"    "time")func main() {    f, err := os.OpenFile("mytest.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)    if err != nil {        log.Fatal(err)    }    for {        n, err := f.WriteString("blah\n")        if err != nil {            log.Fatal(err)        }        log.Printf("wrote %d bytes\n", n)        time.Sleep(2 * time.Second)    }}當(dāng)它運行時,我rm mytest.log從命令行發(fā)出并觀察到程序在下一次調(diào)用時沒有產(chǎn)生錯誤WriteString()。(我在 Linux 上測試過,其他操作系統(tǒng)可能會有所不同)有沒有辦法檢測文件是否被刪除(除了在每次寫入之前對文件進行統(tǒng)計)?并且大概寫入的字節(jié)只是被操作系統(tǒng)丟棄了?
查看完整描述

1 回答

?
收到一只叮咚

TA貢獻1821條經(jīng)驗 獲得超5個贊

在運行時,我從命令行發(fā)出 rm mytest.log 并觀察到該程序在下次調(diào)用時不會產(chǎn)生錯誤WriteString()

是的,這正是指定的行為。該文件也沒有被刪除。唯一rm刪除的是文件系統(tǒng)中的特定路徑條目。單個文件可以有多個路徑,也稱為硬鏈接。

只有當(dāng)文件系統(tǒng)條目(鏈接)或文件描述符(在程序中打開的文件)對它的最后一次引用已關(guān)閉時,才會刪除實際文件。

Unix 文件模型的這種特殊行為長期用于實現(xiàn)“未命名”共享內(nèi)存,通過創(chuàng)建和打開文件,然后/dev/shm刪除文件系統(tǒng)條目——因為這種特殊的做事方式引入了競爭條件,為了安全敏感應(yīng)用程序引入了新的系統(tǒng)調(diào)用,允許創(chuàng)建匿名內(nèi)存映射,最近 Linux 甚至獲得了在文件系統(tǒng)中創(chuàng)建文件的功能,而無需創(chuàng)建路徑條目(open帶有O_TMPFILE標(biāo)志)。

在較新版本的 Linux 上,您甚至可以為已使用系統(tǒng)調(diào)用刪除最后一個條目的文件重新/創(chuàng)建文件系統(tǒng)條目linkat。

更新

問題是,如果最后一個文件系統(tǒng)條目消失了,你真的想報錯嗎?畢竟這不是一個糟糕的情況,您可以安全地寫入和讀取,沒有問題,請注意,一旦您關(guān)閉文件的最后一個文件描述符,它就會丟失。

完全有可能檢測到最后一個文件系統(tǒng)條目是否已被刪除,如果是,則中止文件操作——但是請注意,這樣的代碼可能會引入它自己的問題,例如,如果程序希望創(chuàng)建一個新的文件系統(tǒng)條目,使用 linkat 將所有內(nèi)容正確寫入文件后。

無論如何,您可以做的是fstat-ing 文件(file.Stat在 Go 中)并查看文件具有的硬鏈接數(shù)。如果該數(shù)字降為零,則所有文件系統(tǒng)條目都將消失。

package main


import (

? ? "fmt"

? ? "log"

? ? "os"

? ? "syscall"

? ? "time"

)


func main() {

? ? fmt.Println("Test Operation")

? ? f, err := os.OpenFile("test.txt", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)

? ? if err != nil {

? ? ? ? log.Fatal(err)

? ? }


? ? for {


? ? ? ? n, err := f.WriteString("blah\n")

? ? ? ? if err != nil {

? ? ? ? ? ? log.Fatal(err)

? ? ? ? }

? ? ? ? log.Printf("wrote %d bytes\n", n)

? ? ? ? time.Sleep(2 * time.Second)

? ? ? ? stat, err := f.Stat()

? ? ? ? if err != nil{

? ? ? ? ? ? log.Fatal(err)

? ? ? ? }

? ? ? ? if sys := stat.Sys(); sys != nil {

? ? ? ? ? ? if stat, ok := sys.(*syscall.Stat_t); ok {

? ? ? ? ? ? ? ? nlink := uint64(stat.Nlink)

? ? ? ? ? ? ? ? if 0 == nlink {

? ? ? ? ? ? ? ? ? ? log.Printf("All filesystem entries to original file removed, exiting")

? ? ? ? ? ? ? ? ? ? break

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? }

? ? }

}


查看完整回答
反對 回復(fù) 2023-05-08
  • 1 回答
  • 0 關(guān)注
  • 167 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號