我在Swift中编写代码来写入POSIX系统上的文件(它适用于Linux和OSX),并使用POSIX open(2)和write(2)系统调用。但是,我发现,在写入标准输出时,对打开的文件描述符执行此操作会产生“错误的文件描述符”错误;即写信给stdout时:
> 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库还不是一个选项)?感谢。
答案 0 :(得分:3)
你必须通过O_WRONLY
("仅限写作和#34;)或
O_RDWR
("开放阅读和写作")标记为open()
,
否则你不能写入文件描述符:
let fd = open("/tmp/testfile", O_WRONLY | O_CREAT, 0o644)