天天看點

臨時檔案建立函數

ISO C 标準庫提供了兩個函數以幫助建立臨時檔案。

tmpnam 函數産生一個與現有檔案名不同的一個有效路徑名字元串,其最多調用次數由 <stdio.h> 中的 TMP_MAX 來指定。若 ptr 是 NULL,則産生的路徑名存放在一個靜态區中,指向該靜态區的指針作為函數值傳回。後續再調用 tmpname 時會重寫該靜态區,這意味着如果調用此函數多次,而且想儲存路徑名,則應該儲存路徑名的副本,而非指針的副本。若 ptr 不是 NULL,則認為它應該是指向至少 L_tmpnam(在 <stdio.h> 中)個字元的數組。注意,該函數在 SUSv4 中被标記為棄用,但 ISO C 标準仍繼續支援。

tmpfile 建立一個臨時二進制檔案(類型為 wb+),在關閉該檔案或程式結束時将自動删除這種檔案。該函數經常使用的标準 UNIX 技術是先調用 tmpnam 産生一個唯一的路徑名,然後再用該路徑名建立一個檔案,并立即 unlink 它。因為對一個檔案解除連結并不删除其内容,要關閉該檔案時才會,而關閉檔案可以是顯式的,也可以在程式終止時自動進行。

下列程式說明了這兩個函數的應用。

運作結果如下:

Single UNIX Specification 擴充中為處理臨時檔案定義了下面另外兩個函數,它們是 XSI 的擴充部分。

mkdtemp 使用權限集“S_IRUSR|S_IWUSR|S_IXUSR”建立了一個具有唯一名字的目錄。而 mkstemp 建立一個具有唯一名字的檔案,并以權限集“S_IRUSR|S_IWUSR”打開該檔案,另外也不會自動删除該檔案。這兩個函數都是通過 template 字元串來建立目錄或檔案的,該字元串是後 6 位設定為“XXXXXX”的路徑名,函數将這些占位符替換成不同的字元串來建構一個唯一的路徑名。如果成功,這兩個函數都将修改 template 字元串以反映臨時檔案的名字。

mkstemp 函數使用示例:

運作結果示例:

兩個模闆字元串聲明方式的不同帶來了不同的運作結果。因為第一個模闆使用了數組,名字是在棧上配置設定的。但第二個使用了指針,此時隻有指針自身駐留在棧上。編譯器把字元串存放在可執行檔案的隻讀段,當 mkstemp 函數試圖修改該字元串時,就會出現段錯誤。

繼續閱讀