避免使用裸的 mkdir p

2021-08-08 15:41:20 字數 2356 閱讀 6791

首先說明一下,這裡的裸是指不事先判斷目錄是否存在,直接使用 mkdir -p 建立。

如果經常與檔案系統打交道,少不了會有建立目錄的操作。

比如,我們想在某台機器上同步某個檔案目錄,就需要確保它的父目錄存在。如果不存在,可能還需要根據需要動態建立。

系統提供了很多可以直接使用的命令,它的好處是顯而易見的,當你不想在遠端裝 agent 來操作,而選擇使用 ssh 連線,直接使用這些現成命令是乙個簡單有效的選擇。

如果建立目錄,可以選擇使用 mkdir 命令。如果系統可能有多級目錄不存在,我們可能會考慮 -p 選項。

-p 類似於程式設計裡面的遞迴思想,但是有一點要注意注意注意,它是從檔案系統的根開始判斷的,而不是從最完整的目錄。

# ...

mkdir("/tmp", 0755) = -1 eexist (file exists)

chdir("/tmp") = 0

mkdir("foo", 0755) = 0

open("foo", o_rdonly|o_noctty|o_nonblock|o_directory|o_nofollow) = 3

fchdir(3) = 0

close(3) = 0

mkdir("bar", 0755) = 0

open("bar", o_rdonly|o_noctty|o_nonblock|o_directory|o_nofollow) = 3

fchdir(3) = 0

close(3) = 0

mkdir("bazz", 0755) = 0

open("bazz", o_rdonly|o_noctty|o_nonblock|o_directory|o_nofollow) = 3

fchdir(3) = 0

close(3) = 0

mkdir("baxx", 0755) = 0

open("baxx", o_rdonly|o_noctty|o_nonblock|o_directory|o_nofollow) = 3

fchdir(3) = 0

close(3) = 0

fchdir(3) = 0

close(3) = 0

mkdir("boy", 0755) = 0

open("boy", o_rdonly|o_noctty|o_nonblock|o_directory|o_nofollow) = 3

fchdir(3) = 0

close(3) = 0

mkdir("cat", 0755) = 0

open("cat", o_rdonly|o_noctty|o_nonblock|o_directory|o_nofollow) = 3

fchdir(3) = 0

close(3) = 0

mkdir("dog", 0755) = 0

# ...

天哪,每一級目錄,如果存在,會對應兩個系統呼叫(mkdir、chdir);如果不存在,會對應四個系統呼叫(mkdir、open、fchdir、close)。

當偶而執行一次這類操作,問題倒還不是特別明顯。但是當我們頻繁執行大量與此類似的深層目錄建立的操作時,系統的效能很快就會有所反應。

好的實踐是怎樣的呢?

首先,我們要建立的目錄很有可能已經存在。這一步判斷可以避免 mkdir -p 無條件地執行。test 可以判斷目錄或檔案是否存在,它只是乙個簡單的 stat 系統呼叫,very cheap。

當然,如果只是手動建立目錄,-p 並沒有太大的***。視情況而定。

declspec naked 使用(裸函式)

最近學習驅動開發,在寫繞過inline hook的 時,有個問題困擾了我一天,最後發現原來是在內嵌彙編時,沒有使用 declspec naked 導致的,看來是偶的基礎知識掌握的不牢固啊 得補一下了,磨刀不誤砍柴功 在此給記錄一下,給自己乙個警示。對於jmp型別的hook,如果自己的過程沒有使用 d...

mysql 裸裝置 Mysql5 5使用裸裝置儲存

mysql的innodb支援把錶和索引儲存在裸裝置中,儲存的i o等待問題一直是影響資料庫效能的關鍵,裸裝置不需要經過檔案系統i o處理,因而在效能上有一定的提公升,在 一 建立lvm卷,並使用raw來繫結,其中raw1 raw5為oracle的asm磁碟 二 修改my.cnf檔案,在 mysqld...

mysql 裸裝置 Mysql5 5使用裸裝置儲存

mysql的innodb支援把錶和索引儲存在裸裝置中,儲存的i o等待問題一直是影響資料庫效能的關鍵,裸裝置不需要經過檔案系統i o處理,因而在效能上有一定的提公升,在 一 建立lvm卷,並使用raw來繫結,其中raw1 raw5為oracle的asm磁碟 二 修改my.cnf檔案,在 mysqld...