sysopen FILEHANDLE,FILENAME,MODE
sysopen FILEHANDLE,FILENAME,MODE,PERMS

開啟檔案,其檔名由 FILENAME 給出,並將其與 FILEHANDLE 關聯。如果 FILEHANDLE 是表達式,其值將用作想要的真實檔案句柄;未定義的純量將適當地自動化。此函式呼叫底層作業系統的 open(2) 函式,其參數為 FILENAME、MODE 和 PERMS。

成功時傳回 true,否則傳回 undef

PerlIO 層會套用在句柄上,其方式與在未指定層的 open 呼叫中相同。也就是說,${^OPEN} 的目前值,由 open 實用範例在詞彙範圍內設定,或在主程式範圍內設定 -C 命令列選項或 PERL_UNICODE 環境變數,退而求其次,使用 "PerlIO 中的預設值和如何覆寫它們" 中所述的平台預設值。如果您想要移除任何可能轉換位元組串流的層,請在開啟後使用 binmode

MODE 參數的可能值和旗標位元取決於系統;它們可透過標準模組 Fcntl 取得。請參閱作業系統的 open(2) 系統呼叫文件,以查看有哪些值和旗標位元可用。您可以使用 | 運算子組合多個旗標。

最常見的一些值包括用於以唯讀模式開啟檔案的 O_RDONLY、用於以唯寫模式開啟檔案的 O_WRONLY 以及用於以讀寫模式開啟檔案的 O_RDWR

由於歷史原因,有些值幾乎可以在 Perl 支援的所有系統上執行:0 表示唯讀,1 表示唯寫,2 表示讀寫。我們知道這些值在 OS/390 下無法執行;您可能不希望在新的程式碼中使用它們。

如果 FILENAME 指定的檔案不存在,而 open 呼叫建立了該檔案(通常是因為 MODE 包含 O_CREAT 旗標),則 PERMS 的值會指定新建立檔案的權限。如果您省略 sysopen 的 PERMS 參數,Perl 會使用八進位值 0666。這些權限值需要以八進位表示,並會受到您目前的程序 umask 所修改。

在許多系統中,O_EXCL 旗標可用於以獨佔模式開啟檔案。這不是鎖定:獨佔性在此表示如果檔案已存在,則 sysopen 會失敗。O_EXCL 可能無法在網路檔案系統上執行,而且除非 O_CREAT 旗標也設定,否則不會產生任何效果。設定 O_CREAT|O_EXCL 可防止檔案在為符號連結時被開啟。它無法防範檔案路徑中的符號連結。

有時您可能想要截斷已存在的檔案。這可以使用 O_TRUNC 旗標來完成。O_TRUNCO_RDONLY 搭配使用的行為未定義。

您很少會將 0644 用作 sysopen 的參數,因為這樣會取消使用者擁有更寬鬆 umask 的選項。最好省略它。請參閱 umask 以進一步瞭解這一點。

此函數與 sysreadsyswritesysseek 的使用沒有直接關係。使用此函數開啟的控制代碼可以用於緩衝 IO,就像使用 open 開啟的控制代碼可以用於非緩衝 IO 一樣。

請注意,在早於 5.8.0 的 Perl 中,sysopen 取決於 C 函式庫函數 fdopen(3)。在許多 Unix 系統上,已知 fdopen(3) 在檔案描述符超過特定值(通常為 255)時會失敗。如果您需要超過該數量的檔案描述符,請考慮使用 POSIX::open 函數。對於 Perl 5.8.0 和更新版本,PerlIO(通常)是預設值。

請參閱 perlopentut 以取得更親切、更友善的開啟檔案說明。

移植性問題:perlport 中的「sysopen」