我只是在玩一些 GCD 函数来向文件写入和读取数据。其中两个函数是dispatch_write()
and dispatch_read()
,它允许向文件描述符写入和读取数据,而无需设置新的dispatch_io_t
渠道。
所以,我有以下代码:
#import <dispatch/dispatch.h>
#import <stdio.h>
#import <unistd.h>
int main() {
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
int intbuffer[] = { 1, 2, 3, 4 };
dispatch_data_t data = dispatch_data_create(intbuffer, 4 * sizeof(int), queue, NULL);
// Write
dispatch_fd_t fd = open("data.dat", O_RDWR);
printf("FD: %d\n", fd);
dispatch_write(fd, data, queue,^(dispatch_data_t d, int e) {
printf("Written %zu bytes!\n", dispatch_data_get_size(d));
printf("\tError: %d\n", e);
});
close(fd);
// Read
fd = open("data.dat", O_RDWR);
dispatch_read(fd, 4 * sizeof(int), queue, ^(dispatch_data_t d, int e) {
printf("Read %zu bytes!\n", dispatch_data_get_size(d));
printf("\tError: %d\n", e);
});
close(fd);
// Exit confirmation
getchar();
return 0;
}
我尝试将一个 4 整数数组写入文件,然后将其读回。我之前创建的data.dat
与touch
命令并且任何人都可以完全访问它(sudo chmod 777 data.dat
).
当我执行这段代码时,看起来data.dat
打开成功,因为程序打印出来FD: 3
,这是一个有效的文件描述符,但是dispatch_write
没有写任何东西,因为我得到:
Written 0 bytes!
Error: 9
Read 0 bytes!
Error: 9
错误 9 的代码是EBADF
错误,但是,3 是一个有效的文件描述符。
那么,我做错了什么?