Imported upstream version 1.5
[manpages-zh.git] / src / man2 / open.2
blobf4c59afe6c97532f0bec266fcf8933023b9a436a
2 .TH OPEN 2 1999-06-03 "Linux" "System calls"
3 .SH NAME
4 open, creat \- 用来 打开和创建 一个 文件或设备
5 .SH SYNOPSIS 总览
6 .nf
7 .B #includ e <sys/types.h>
8 .B #include <sys/stat.h>
9 .B #include <fcntl.h>
10 .sp
11 .BI "int open(const char *" pathname ", int " flags );
12 .BI "int open(const char *" pathname ", int " flags ", mode_t " mode )
13 .BI "int creat(const char *" pathname ", mode_t " mode );
14 .fi
15 .SH "描述 (DESCRIPTION)"
16 .B open()
17 通常 用于 将 路径名 转换为 一个 文件描述符 (一个 非负的 小 整数, 在
18 .B read " , "write
19 等 I/O操作中 将会被使用). 当
20 .B open()
21 调用 成功, 它会 返回 一个 新的 文件描述符 (永远取 未用 描述符的 最小值).
22 这个调用 创建 一个 新的 打开文件, 即 分配 一个 新的 独一无
23 二的 文件描述符, 不会与 运行中的 任何 其他程序 共享 (但 可以 通过
24 .B fork (2)
25 系统调用 实现 共享).
26 这个 新的 文件描述符 在其后 对 打开文件操作 的函数 中 使用.(参考
27 .BR fcntl (2)).
28 文件的 读写 指针 被 置于 文件头
30 参数
31 .I flags
32 是通过
33 .BR O_RDONLY ", " O_WRONLY " 或 " O_RDWR
34 (指明 文件 是以 只读 , 只写 或 读写 方式 打开的)
35 与 下面的 零个 或 多个 可选模式 按位
36 .RI - or
37 操作 得到的:
38 .TP
39 .B O_CREAT
40 若文件 不存在 将 创建 一个 新 文件.
41 新 文件 的 属主 (用户ID) 被 设置 为 此 程序 的 有效 用户 的 ID.
42 同样 文件 所属 分组 也 被 设置 为 此 程序 的 有效 分组 的 ID
43 或者 上层 目录 的 分组 ID (这 依赖 文件系统 类型 ,装载选项 和 上层目录 的 模式,
44 参考,在
45 .BR mount (8)
46 中 描述 的 ext2 文件系统 的 装载选项
47 .I bsdgroups
48
49 .I sysvgroups
51 .TP
52 .B O_EXCL
53 通过
54 .BR O_CREAT ,
55 生成 文件 , 若 文件 已经 存在 , 则
56 .B open
57 出错 , 调用 失败 . 若是 存在 符号联接 , 将会 把 它的 联接指针 的 指向 文件 忽略.
58 .B O_EXCL
59 is broken on NFS file systems, programs which rely on it for performing
60 locking tasks will contain a race condition.  The solution for performing
61 atomic file locking using a lockfile is to create a unique file on the same
62 fs (e.g., incorporating hostname and pid), use
63 .BR link (2)
64 to make a link to the lockfile. If \fBlink()\fP returns 0, the lock is
65 successful.  Otherwise, use
66 .BR stat (2)
67 on the unique file to check if its link count has increased to 2,
68 in which case the lock is also successful.
69 .TP
70 .B O_NOCTTY
71 假如
72 .I pathname
73 引用 一个 终端设备 \(em 参考
74 .BR tty (4)
75 \(em 即使 进程 没有 控制终端 ,这个 终端 也 不会 变成 进程 的 控制 终端.
76 .TP
77 .B O_TRUNC
78 假如 文件 已经 存在 , 且是 一个 普通 文件 ,打开 模式 又是 可写(即 文件 是 用
79 O_RDWR 或 O_WRONLY 模式 打开 的) , 就把 文件 的 长度 设置 为 零 , 丢弃 其中
80 的 现有 内容.若 文件 是 一个 FIFO 或 终端设备 文件 , O_TRUNC 标志 被 忽略.
81 其他 O_TRUNC 的 作用 是 不 具体 指定 的 (在 许多 Linux 版本 中 , 通常 会 被 忽略 ,
82 其他 的 一些 版本 将 返回 一个 错误)
83 .TP
84 .B O_APPEND
85 文件 以 追加 模式 打开 . 在
86 .BR 写
87 以前 , 文件 读写 指针 被 置 在 文件 的 末尾 .
88 as if with
89 .BR lseek .
90 .B O_APPEND
91 may lead to corrupted files on NFS file systems if more than one process
92 appends data to a file at once.  This is because NFS does not support
93 appending to a file, so the client kernel has to simulate it, which
94 can't be done without a race condition.
95 .TP
96 .BR O_NONBLOCK " 或 " O_NDELAY
97 .B 打开(open)
98 文件 可以 以 非块(non-blocking) 模式 打开 . 此时 文件 并 没有 打开 , 也 不能 使用 返回 的
99 文件描述符 进行 后续 操作 , 而是 使 调用 程序 等待 . 此 模式 是 为了 FIFO (命名管道) 的 处理
100 , 参考
101 .BR fifo (4).
102 这种 模式 对 除了 FIFO 外 没有 任何 影响 .
104 .B O_SYNC
105 打开 文件 实现 I/O 的 同步 . 任何 通过 文件描述符 对 文件 的
106 .BR write
107 都会 使 调用 的 进程 中断 , 直到 数据 被 真正 写入 硬件 中 .
108 其他 , 参考
109 .I RESTRICTIONS.
111 .B O_NOFOLLOW
112 假如 \fIpathname\fR 是 一个 符号 联接 , 则 打开 失败 . 这是 FreeBSD
113 的 扩充 , 从 2.1.126 版本 以来 被 引入 到 Linux 中来 .
114 从 glibc2.0.100 库 以来 , 头文件 中 包括 了 这个 参数 的 定义;
115  \fI kernel 2.1.126 以前 将 忽略 它的 使用\fR.
117 .B O_DIRECTORY
118 假如 \fIpathname\fR 不是 目录 , 打开 就 失败 . 这个 参数 是 Linux 特有 的 ,
119 在 kernel 2.1.126 中 加入 , 为了 避免 在 调用 FIFO 或 磁带设备 时 的 denial-of-service
120 问题 , 但是 不应该 在 执行 \fBopendir\fR 以外 使用.
122 .B O_LARGEFILE
123 在 32位 系统 中 支持 大 文件系统 , 允许 打开 那些 用 31位 都 不能 表示 其 长度 的 大 文件 .
125 在 文件 打开 后 , 这些 可选 参数 可以 通过
126 .B fcntl
127 来 改变 .
129 在 新文件 被 创建 时 , 参数
130 .I mode
131 具体 指明 了 使用 权限 . 他 通常 也 会 被
132 .BR umask
133 修改 . 所以 一般 新建 文件 的 权限 为
134 .BR "(mode & ~umask)" .
135 注意 模式 只 被 应用 于 将来 对 这 新文件 的 使用 中;
136 .B open
137 调用 创建 一个 新的 只读 文件 , 但 仍 将 返回 一个 可 读写 文件 描述符.
139 后面 是 一些
140 .IR mode
141 的 具体 参数:
143 .B S_IRWXU
144 00700 允许 文件 的 属主 读 , 写 和 执行 文件
146 .B S_IRUSR (S_IREAD)
147 00400 允许 文件 的 属主 读 文件
149 .B S_IWUSR (S_IWRITE)
150 00200 允许 文件 的 属主 写 文件
152 .B S_IXUSR (S_IEXEC)
153 00100 允许 文件 的 属主 执行 文件
155 .B S_IRWXG
156 00070 允许 文件 所在 的 分组 读 , 写 和 执行 文件
158 .B S_IRGRP
159 00040 允许 文件 所在 的 分组 读 文件
161 .B S_IWGRP
162 00020 允许 文件 所在 的 分组 写 文件
164 .B S_IXGRP
165 00010 允许 文件 所在 的 分组 执行 文件
167 .B S_IRWXO
168 00007 允许 其他 用户 读 , 写 和 执行 文件
170 .B S_IROTH
171 00004 允许 其他 用户 读 文件
173 .B S_IWOTH
174 00002 允许 其他 用户 写 文件
176 .B S_IXOTH
177 00001 允许 其他 用户 执行 文件
179 .I mode
180 只有 当 在
181 .IR flags
182 中 使用
183 .B O_CREAT
184 时 才 有效 , 否则 被 忽略.
186 .B creat
187 相当 于
188 .B open
189 的 参数
190 .I flags
191 等于
192 .BR O_CREAT|O_WRONLY|O_TRUNC .
193 .SH RETURN VALUE 返回值
194 .BR open " 和 " creat
195 都 返回 一个 新的 文件描述符 (若是 有 错误 发生 返回 \-1 ,并在
196 .I errno
197 设置 错误 信息).
198 注意
199 .B open
200 可以 打开 设备 专用 文件 , 但是
201 .B creat
202 不能创建,需要用
203 .BR mknod (2)
204 来代替.
206 On NFS file systems with UID mapping enabled, \fBopen\fP may return a file
207 descriptor but e.g. \fBread\fP(2) requests are denied with \fBEACCES\fP.
208 This is because the client performs \fBopen\fP by checking the permissions,
209 but UID mapping is performed by the server upon read and write requests.
211 若 文件 是 新 建立 的 , 他 的 atime(上次访问时间), ctime(创建时间), mtime(修改时间) 都 被 修改 为 当前 时间
212 , 上层 目录 的atime , ctime 也 被 同样 修改 . 其他的 , 假如 文件 是 由 O_TRUNC 参数 修改
213 的 ,它的 ctime , mtime 域 也 被 设置 为 当前 时间.
215 .SH ERRORS 错误信息
217 .B EEXIST
218 参数
219 .BR O_CREAT " and " O_EXCL
221 使用,但是文件(
222 .I pathname
223 )已经存在.
225 .B EISDIR
226 文件名 (
227 .I pathname
228 ) 是 一个 目录 , 而 又 涉及 到 写 操作.
230 .B EACCES
231  访问 请求 不 允许 (权限不够) , 在 文件名 (
232 .IR pathname
233 )中 有 一 目录 不允许 搜索 (没有 执行权限) , 或者 文件 还 不存在 且 对 上层目录 的 写 操作 又 不允许.
235 .B ENAMETOOLONG
236 文件名 (
237 .IR pathname
238 ) 太 长 了
240 .B ENOENT
241 目录 (
242 .I pathname
243 ) 不存在 或者 是 一个 悬空 的 符号 联接.
245 .B ENOTDIR
246 .I pathname
247 不是 一个 子目录
249 .B ENXIO
250 使用
251 O_NONBLOCK | O_WRONLY, 命名 的 文件 是 FIFO , 所读 文件 还 没有 打开 的 文件 ,
252 或者 , 打开 一个 设备 专用 文件 而 相应 的 设备 不存在
254 .B ENODEV
255 文件 (
256 .I pathname
257 ) 引用 了 一个 设备 专用 文件 , 而 相应 的 设备 又 不存在.
258 (这是 linux kernel 的 一个bug - ENXIO 一定 会 被 返回 .)
260 .B EROFS
261 文件 (
262 .I pathname
263 ) 是 一个 只读 文件 , 又有 写 操作 被 请求.
265 .B ETXTBSY
266 文件 (
267 .I pathname
268 ) 是 一个 正在 被 执行 的 可 执行 文件 ,又有 写 操作 被 请求.
270 .B EFAULT
271 .IR pathname
272 在一个你不能访问的地址空间.
274 .B ELOOP
275 在 分解
276 .IR pathname
277 时 , 遇到 太多 符号联接 或者 指明 \fBO_NOFOLLOW\fR 但是
278 .I pathname
279 是 一个 符号联接
281 .B ENOSPC
282 .I pathname
283 将要被创建,但是设备又没有空间储存
284 .I pathname
285 文件了
287 .B ENOMEM
288 可 获得 的 核心内存(kernel memory) 不够
290 .B EMFILE
291 程序打开的文件数已经达到最大值了
293 .B ENFILE
294 系统打开的总文件数已经达到了极限
295 .SH "CONFORMING TO"
296 SVr4, SVID, POSIX, X/OPEN, BSD 4.3
298 .B O_NOFOLLOW
300 .B O_DIRECTORY
301 flags are Linux-specific.
302 One may have to define the
303 .B _GNU_SOURCE
304 macro to get their definitions.
305 .SH RESTRICTIONS 无限制
306 There are many infelicities in the protocol underlying NFS, affecting
307 amongst others
308 .BR O_SYNC " and " O_NDELAY .
310 POSIX provides for three different variants of synchronised I/O,
311 corresponding to the flags \fBO_SYNC\fR, \fBO_DSYNC\fR and
312 \fBO_RSYNC\fR.  Currently (2.1.130) these are all synonymous under Linux.
313 .SH SEE ALSO 参见
314 .BR read (2),
315 .BR write (2),
316 .BR fcntl (2),
317 .BR close (2),
318 .BR link (2),
319 .BR mknod (2),
320 .BR mount (2),
321 .BR stat (2),
322 .BR umask (2),
323 .BR unlink (2),
324 .BR socket (2),
325 .BR fopen (3),
326 .BR fifo (4)
328 .SH "[中文版维护人]"
329 .B Daniel <badlong@163.com>
330 .SH "[中文版最新更新]"
331 .BR 2002/01/10
332 .SH "《中国linux论坛man手册页翻译计划》:"
333 .BI http://cmpp.linuxforum.net