2016-02-23 3 views
1

Я пишу код в Swift для записи в файл в системе POSIX (он предназначен для работы с Linux и OSX) и с использованием POSIX open (2) и запись (2) системных вызовов. Тем не менее, я обнаружил, что при записи на стандартный вывод работает, делая это для открытого дескриптора файла, дает ошибку «Bad file descriptor»; то есть, при записи в стандартный вывод:POSIX write (2) для дескриптора файла в Swift с ошибкой «Bad file descriptor»

> 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 еще не является вариантом)? Благодарю.

ответ

2

Вы должны пройти O_WRONLY («открыт только для записи») или O_RDWR («открыт для чтения и записи») флага open(), в противном случае вы не можете писать в файл дескриптора:

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

Благодаря; это и сделал трюк. – acb

+0

@acb: Добро пожаловать! (Обратите внимание, что вы можете * принять * ответ, если это помогло, чтобы отметить проблему как решение.) –

Смежные вопросы