【问题标题】:POSIX write(2) to file descriptor in Swift fails with “Bad file descriptor”POSIX write(2) to file descriptor in Swift 失败并显示“Bad file descriptor”
【发布时间】:2016-06-05 12:49:31
【问题描述】:

我正在用 Swift 编写代码以写入 POSIX 系统上的文件(它适用于 Linux 和 OSX),并使用 POSIX open(2) 和 write(2) 系统调用。但是,我发现,虽然写入标准输出有效,但对打开的文件描述符执行此操作会产生“错误文件描述符”错误;即,写入标准输出时:

> let bytes: [UInt8] = [ 65, 66, 67, 13, 10 ]
> write(STDOUT_FILENO, UnsafePointer(bytes), 5)
ABC

打开文件时:

> let fd = open("/tmp/testfile", O_CREAT, 0o644)
fd: CInt = 3
> write(fd, UnsafePointer(bytes), 5) 
$R1: Int = -1
> print(String.fromCString(strerror(errno)))
Optional("Bad file descriptor")

这发生在 OSX(导入 Darwin)和 Linux(导入 Glibc)上。在这两种情况下,文件都会被创建,并且大小保持为 0。我做错了什么,或者 Swift 或 Swift/C 接口中是否存在错误,如果是后者,是否有人知道解决方法(这将适用Linux;使用 Cocoa/Foundation 库还不是一个选项)?谢谢。

【问题讨论】:

    标签: swift posix file-descriptor


    【解决方案1】:

    您必须通过O_WRONLY(“仅供写作”)或 O_RDWR(“打开读写”)标志到open(), 否则无法写入文件描述符:

    let fd = open("/tmp/testfile", O_WRONLY | O_CREAT, 0o644)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 2018-04-22
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多