打开文件名由 FILENAME 给出的文件,并将其与 FILEHANDLE 关联。如果 FILEHANDLE 是一个表达式,则其值将用作所需的真实文件句柄;未定义的标量将被适当地自动创建。此函数使用参数 FILENAME、MODE 和 PERMS 调用底层操作系统的 open(2) 函数。
成功时返回真值,否则返回 undef
。
PerlIO 层将以与在不指定层的情况下进行 open
调用相同的方式应用于句柄。也就是说,当前 ${^OPEN}
的值(由 open 编译指示在词法范围内设置,或由 -C
命令行选项或 PERL_UNICODE
环境变量在主程序范围内设置),回退到 "PerlIO 中的默认值和如何覆盖它们" 中描述的平台默认值。如果您想删除可能转换字节流的任何层,请在打开它后使用 binmode
。
MODE 参数的可能值和标志位是系统相关的;它们可以通过标准模块 Fcntl
获得。请参阅您操作系统 open(2) 系统调用的文档,以查看哪些值和标志位可用。您可以使用 |
运算符组合多个标志。
一些最常见的 value 是 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_TRUNC
与 O_RDONLY
一起使用时的行为是未定义的。
您应该很少使用 0644
作为 sysopen
的参数,因为这会剥夺用户拥有更宽松 umask 的选项。最好省略它。有关详细信息,请参阅 umask
。
此函数与 sysread
、syswrite
或 sysseek
的用法没有直接关系。使用此函数打开的句柄可以与缓冲 I/O 一起使用,就像使用 open
打开的句柄可以与非缓冲 I/O 一起使用一样。
请注意,在低于 5.8.0 版本的 Perl 中,sysopen
依赖于 fdopen(3) C 库函数。在许多 Unix 系统上,fdopen(3) 在文件描述符超过某个值(通常为 255)时会失败。如果您需要更多文件描述符,请考虑使用 POSIX::open
函数。对于 5.8.0 及更高版本的 Perl,PerlIO 通常是默认的。
有关更友好的文件打开说明,请参阅 perlopentut。
可移植性问题:"perlport 中的 sysopen"。