作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我只是在玩一些 GCD 函数来向文件写入和读取数据。其中两个函数是 dispatch_write()
和 dispatch_read()
,它允许人们在文件描述符中写入和读取数据而无需设置新的 dispatch_io_t
channel 。
所以,我有以下代码:
#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;
}
data.dat
与
touch
命令,任何人都可以完全访问它(
sudo chmod 777 data.dat
)。
data.dat
成功打开,因为程序打印出
FD: 3
,这是一个有效的文件描述符,但
dispatch_write
没有写任何东西,因为我得到:
Written 0 bytes!
Error: 9
Read 0 bytes!
Error: 9
EBADF
的代码错误,但同样,3 是一个有效的文件描述符。
最佳答案
dispatch_read
和 dispatch_write
不是同步调用——这就是他们的重点。换句话说,按照您在此处设置的方式,您 close
调用后的文件描述符 dispatch_write
.当 GCD 在后台线程上执行写入时,文件描述符已经关闭。读取操作相同。您必须等到写操作完成后才能关闭文件。
我稍微修改了你的代码以使用 dispatch_semaphore
在关闭文件之前等待写入和读取完成:
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);
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
// Write
dispatch_fd_t fd = open("/tmp/data.dat", O_RDWR | O_CREAT | O_TRUNC, S_IRWXU | S_IRWXG | S_IRWXO);
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(data) - (d ? dispatch_data_get_size(d) : 0));
printf("\tError: %d\n", e);
dispatch_semaphore_signal(sem);
});
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
close(fd);
// Read
fd = open("/tmp/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);
dispatch_semaphore_signal(sem);
});
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
close(fd);
// Exit confirmation
getchar();
return 0;
}
关于macos - dispatch_write() 和 dispatch_read() 用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17948903/
我只是在玩一些 GCD 函数来向文件写入和读取数据。其中两个函数是 dispatch_write()和 dispatch_read() ,它允许人们在文件描述符中写入和读取数据而无需设置新的 disp
我正在尝试创建一个具有唯一名称的文件并在后台向其写入数据。 mktemp 说 只要有可能,就应该使用 mkstemp(),因为它没有竞争条件。 使用 mkstemp 会产生一个打开的文件描述符,因此
我是一名优秀的程序员,十分优秀!