gpt4 book ai didi

macos - dispatch_write() 和 dispatch_read() 用法

转载 作者:行者123 更新时间:2023-12-04 23:55:02 25 4
gpt4 key购买 nike

我只是在玩一些 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;
}

我试图用它将一个 4 整数数组写入文件,然后再读回它。我之前创建过 data.dattouch命令,任何人都可以完全访问它( sudo chmod 777 data.dat )。

当我执行这段代码时,似乎 data.dat成功打开,因为程序打印出 FD: 3 ,这是一个有效的文件描述符,但 dispatch_write没有写任何东西,因为我得到:
Written 0 bytes!
Error: 9
Read 0 bytes!
Error: 9

错误 9 是 EBADF 的代码错误,但同样,3 是一个有效的文件描述符。

那么,我做错了什么?

最佳答案

dispatch_readdispatch_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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com