NAME
open, creat - 用 來 打 開 和 創 建 一 個 文 件 或 設 備
SYNOPSIS 總 覽
#includ e
<sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int
open(const char *pathname, int
flags);
int open(const char *pathname, int
flags, mode_t mode)
int creat(const char *pathname, mode_t
mode);
描 述 (DESCRIPTION)
open()
通 常 用 於 將 路
徑 名 轉 換 爲 一
個 文 件 描 述 符
( 一 個 非 負 的
小 整 數 , 在 read ,
write 等 I/O 操 作 中 將
會 被 使 用 ) 。
當 open() 調 用 成 功
, 它 會 返 回 一
個 新 的 文 件 描
述 符 ( 永 遠 取
未 用 描 述 符 的
最 小 值 ) 。 這
個 調 用 創 建 一
個 新 的 打 開 文
件 , 即 分 配 一
個 新 的 獨 一 無
二 的 文 件 描 述
符 , 不 會 與 運
行 中 的 任 何 其
他 程 序 共 享 (
但 可 以 通 過 fork (2)
系 統 調 用 實 現
共 享 ) 。 這 個
新 的 文 件 描 述
符 在 其 後 對 打
開 文 件 操 作 的
函 數 中 使 用 (
參 考 fcntl(2) ) 文 件
的 讀 寫 指 針 被
置 於 文 件 頭 參
數 flags 是 通 過
O_RDONLY, O_WRONLY 或 O_RDWR
(指 明 文 件 是 以
只 讀 , 只 寫 或 讀
寫 方 式 打 開 的 )
與 下 面 的 零 個
或 多 個 可 選 模
式 按 位 -or 操 作
得 到 的 :
O_CREAT 若 文 件 不 存
在 將 創 建 一 個
新 文 件 . 新 文 件
的 屬 主 (用 戶 ID) 被
設 置 爲 此 程 序
的 有 效 用 戶 的 ID.
同 樣 文 件 所 屬
分 組 也 被 設 置
爲 此 程 序 的 有
效 分 組 的 ID 或 者
上 層 目 錄 的 分
組 ID (這 依 賴 文 件
系 統 類 型 ,裝 載
選 項 和 上 層 目
錄 的 模 式 , 參 考
,在 mount(8) 中 描 述
的 ext2 文 件 系 統 的
裝 載 選 項 bsdgroups
和 sysvgroups )
O_EXCL 通 過 |
O_CREAT, 生 成 文 件 , 若 文 件 已 經 存 在 , 則 open 出 錯 , 調 |
用 失 敗 . 若 是 存 在 符 號 聯 接 , 將 會 把 它 的 聯 接 指 針 的 指 向 文 件 忽 略 . O_EXCL is broken on NFS file systems, programs which rely on it for performing locking tasks will contain a race condition. The solution for performing atomic file locking using a lockfile is to create a unique file on the same fs (e.g., incorporating hostname and pid), use link(2) to make a link to the lockfile. If link() returns 0, the lock is successful. Otherwise, use stat(2) on the unique file to check if its link count has increased to 2, in which case the lock is also successful.
O_NOCTTY 假
如 pathname 引 用 一 個
終 端 設 備 — 參
考 tty(4) — 即 使 進
程 沒 有 控 制 終
端 ,這 個 終 端 也
不 會 變 成 進 程
的 控 制 終 端 .
O_TRUNC 假 如 文 件 已
經 存 在 , 且 是 一
個 普 通 文 件 ,打
開 模 式 又 是 可
寫 (即 文 件 是 用
O_RDWR 或 O_WRONLY 模 式 打 開
的 ) , 就 把 文 件 的
長 度 設 置 爲 零 ,
丟 棄 其 中 的 現
有 內 容 .若 文 件
是 一 個 FIFO 或 終 端
設 備 文 件 , O_TRUNC 標
誌 被 忽 略 . 其 他
O_TRUNC 的 作 用 是 不
具 體 指 定 的 (在
許 多 Linux 版 本 中 ,
通 常 會 被 忽 略 ,
其 他 的 一 些 版
本 將 返 回 一 個
錯 誤 )
O_APPEND 文 件 以 追 加
模 式 打 開 . 在
寫 以 前 , 文 件
讀 寫 指 針 被 置
在 文 件 的 末 尾 . as
if with lseek. O_APPEND may lead to corrupted
files on NFS file systems if more than one process appends
data to a file at once. This is because NFS does not support
appending to a file, so the client kernel has to simulate
it, which can’t be done without a race condition.
O_NONBLOCK 或 O_NDELAY 打 開
(open) 文 件 可 以 以
非 塊 (non-blocking) 模 式 打
開 . 此 時 文 件 並
沒 有 打 開 , 也 不
能 使 用 返 回 的
文 件 描 述 符 進
行 後 續 操 作 , 而
是 使 調 用 程 序
等 待 . 此 模 式 是
爲 了 FIFO (命 名 管 道
) 的 處 理 , 參 考
fifo(4). 這 種 模 式 對
除 了 FIFO 外 沒 有 任
何 影 響 .
O_SYNC 打 開 文 件 實 現 |
I/O 的 同 步 . 任 何 通 過 文 件 描 述 符 對 文 件 的 |
write 都 會 使 調 用 的 進 程 中 斷 , 直 到 數 據 被 真 正 寫 入 硬 件 中 . 其 他 , 參 考 RESTRICTIONS.
O_NOFOLLOW 假 如 pathname 是 一 個 符 號 聯 接 , 則 打 開 失 敗 . 這 是 FreeBSD 的 擴 充 , 從 2.1.126 版 本 以 來 被 引 入 到 Linux 中 來 . 從 glibc2.0.100 庫 以 來 , 頭 文 件 中 包 括 了 這 個 參 數 的 定 義 ;
kernel 2.1.126 以 前 將 忽 略 它 的 使 用 .
O_DIRECTORY 假
如 pathname 不 是 目 錄
, 打 開 就 失 敗 . 這
個 參 數 是 Linux 特 有
的 , 在 kernel 2.1.126 中 加
入 , 爲 了 避 免 在
調 用 FIFO 或 磁 帶 設
備 時 的 denial-of-service 問
題 , 但 是 不 應 該
在 執 行 opendir 以 外
使 用 .
O_LARGEFILE 在 32位 系 統
中 支 持 大 文 件
系 統 , 允 許 打 開
那 些 用 31位 都 不
能 表 示 其 長 度
的 大 文 件 . 在 文
件 打 開 後 , 這 些
可 選 參 數 可 以
通 過 fcntl 來 改 變 .
在 新 文 件 被 創
建 時 , 參 數 mode 具
體 指 明 了 使 用
權 限 . 他 通 常 也
會 被 umask 修 改 . 所
以 一 般 新 建 文
件 的 權 限 爲 (mode &
~umask). 注 意 模 式 只
被 應 用 於 將 來
對 這 新 文 件 的
使 用 中 ; open 調 用
創 建 一 個 新 的
只 讀 文 件 , 但 仍
將 返 回 一 個 可
讀 寫 文 件 描 述
符 . 後 面 是 一 些
mode 的 具 體 參 數 :
S_IRWXU
00700 允 許 文 件 的 屬 主 讀 , 寫 和 執 行 文 件
S_IRUSR (S_IREAD)
00400 允 許 文 件 的 屬 主 讀 文 件
S_IWUSR (S_IWRITE)
00200 允 許 文 件 的 屬 主 寫 文 件
S_IXUSR (S_IEXEC)
00100 允 許 文 件 的 屬 主 執 行 文 件
S_IRWXG
00070 允 許 文 件 所 在 的 分 組 讀 , 寫 和 執 行 文 件
S_IRGRP
00040 允 許 文 件 所 在 的 分 組 讀 文 件
S_IWGRP
00020 允 許 文 件 所 在 的 分 組 寫 文 件
S_IXGRP
00010 允 許 文 件 所 在 的 分 組 執 行 文 件
S_IRWXO
00007 允 許 其 他 用 戶 讀 , 寫 和 執 行 文 件
S_IROTH
00004 允 許 其 他 用 戶 讀 文 件
S_IWOTH
00002 允 許 其 他 用 戶 寫 文 件
S_IXOTH
00001 允 許 其 他 用 戶 執 行 文 件
mode 只 有 當 在 flags 中 使 用 O_CREAT 時 才 有 效 , 否 則 被 忽 略 .
creat 相 當 於 open 的 參 數 flags 等 於 O_CREAT|O_WRONLY|O_TRUNC.
RETURN VALUE 返 回 值
open 和 creat 都 返 回 一 個 新 的 文 件 描 述 符 (若 是 有 錯 誤 發 生 返 回 -1 ,並 在 errno 設 置 錯 誤 信 息 ). 注 意 open 可 以 打 開 設 備 專 用 文 件 , 但 是 creat 不 能 創 建 ,需 要 用 mknod(2) 來 代 替 .
On NFS file systems with UID mapping enabled, open may return a file descriptor but e.g. read(2) requests are denied with EACCES. This is because the client performs open by checking the permissions, but UID mapping is performed by the server upon read and write requests. 若 文 件 是 新 建 立 的 , 他 的 atime(上 次 訪 問 時 間 ), ctime(創 建 時 間 ), mtime(修 改 時 間 ) 都 被 修 改 爲 當 前 時 間 , 上 層 目 錄 的 atime , ctime 也 被 同 樣 修 改 . 其 他 的 , 假 如 文 件 是 由 O_TRUNC 參 數 修 改 的 ,它 的 ctime , mtime 域 也 被 設 置 爲 當 前 時 間 .
ERRORS 錯 誤 信 息
EEXIST 參 數 |
O_CREAT and O_EXCL 被 使 用 ,但 是 文 件 ( pathname )已 經 存 在 . | |||||||||||||||||||||||||||||||||||
EISDIR 文 件 名 |
( pathname ) 是 一 個 目 錄 , 而 又 涉 及 到 寫 操 作 . 請 求 不 允 許 (權 限 不 夠 ) , 在 文 件 名 ( pathname )中 有 一 目 錄 不 允 許 搜 索 (沒 有 執 行 權 限 ) , 或 者 文 件 還 不 存 在 且 對 上 層 目 錄 的 寫 操 作 又 不 允 許 . ENAMETOOLONG 文 件 名 ( pathname ) 太 長 了
ENOTDIR pathname 不 是 一 個 子 目 錄
沒 有 打 開 的 文 件 , 或 者 , 打 開 一 個 設 備 專 用 文 件 而 相 應 的 設 備 不 存 在
又 不 存 在 . (這 是 linux kernel 的 一 個 bug - ENXIO 一 定 會 被 返 回 .)
ETXTBSY 文 件 ( pathname ) 是 一 個 正 在 被 執 行 的 可 執 行 文 件 , 又 有 寫 操 作 被 請 求 。
|