dispatch_write() 和dispatch_read() 用法

2024-05-21

我只是在玩一些 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.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_read and 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

dispatch_write() 和dispatch_read() 用法 的相关文章

  • 已安装的不带依赖项的 MacPort 列表

    当我做port installed 我得到了数百个无用的项目列表 然而 其中只有少数是我实际安装的第一手端口 其余的都是我不需要直接关联的依赖项 有没有办法只列出我实际安装的端口 即 那些我在命令行手动输入的 比如顶级节点列表或安装历史文件
  • Mac:将按键事件发送到后台窗口

    我在用石英活动服务 https developer apple com library mac documentation Carbon Reference QuartzEventServicesRef Reference referenc
  • 如何在 Matlab 中将数组打印到 .txt 文件?

    我才刚刚开始学习Matlab 所以这个问题可能非常基本 我有一个变量 a 2 3 3 422 6 121 9 4 55 我希望将值输出到 txt 文件 如下所示 2 3 3 422 6 121 9 4 55 我怎样才能做到这一点 fid f
  • Cython 在 Mac OS X 10.8 上编译/链接失败

    我是 python 的新手 尝试使用 Cython 来使用一个简单的例子http blog perrygeo net 2008 04 19 a quick cython introduction http blog perrygeo net
  • 使用 NSURLSession 进行单元测试

    我想为使用共享的方法编写单元测试NSURLSession 特别是 NSURLSessionDataTask下载数据 基本上 我希望目标方法能够接收模拟响应 数据 而不需要互联网连接 模拟这些组件的不太不显眼的方式是什么 我正在考虑填充NSU
  • 使用日期时间作为文件名并随后解析文件名?

    我正在将文件写入硬盘 文件名是这样构建的 String Format 0 yyyy MM dd hh mm ss txt DateTime Now 例如 文件名是 2010 09 20 09 47 04 txt 现在我想在下拉列表中显示这些
  • Python libusb pyusb“mach-o,但架构错误”

    我在使用 pyusb 模块时遇到一些问题 我已将问题范围缩小到一行 并创建了一个小示例脚本来复制错误 usr bin env python This module was created to isolate the problem in
  • NSComboBox:如何告诉用户输入了不在弹出列表中的信息并读取它

    我有一个 NSComboBox 它有一个符合 NSComboBox 数据源和委托的单独类 如果用户在组合框中键入的文本与弹出列表中的一项不匹配 我如何收到用户已键入内容的通知并读取用户键入的值 目前我正在实现委托方法 void comboB
  • 需要一些关于调度队列、线程和 NSRunLoop 的澄清

    以下是我所知道和理解的事情 全局队列是一个同时队列 可以将任务分派给多个线程 不保证执行任务的顺序 例如 dispatch async dispatch get global queue DISPATCH QUEUE PRIORITY DE
  • std::istringstream >> 使奇怪的行为加倍

    下面的代码打印0在 mac osx 上使用 clang 其他地方都会打印5 clang https ideone com mVgpzS gcc https ideone com oZ0hy6 include
  • 在 MacOS 上重新启动终端而不关闭

    如何在不关闭窗口的情况下重新启动当前的 MacOS 终端会话 在Linux中我使用exec bash但在这种环境下它不起作用 我对 bash profile 提示 别名等 我想在不关闭它并再次打开的情况下查看 只需输入命令 exec bas
  • postgresql 数据库在 OS X 上的位置?

    我确信这个问题已经得到解答 但我似乎找不到答案 我使用 Homebrew brew install postgresql 安装了 postgresql 它安装到 usr local Cellar postgresql 后记按照我这样做的说明
  • 是否可以使用“pandoc”将 .tex 文件编译为 PDF?

    是否可以使用 pandoc 编译 tex 文件 我目前正在使用 MacVim 在 MultiMarkdown 中记课堂笔记 这样 当我回到家时 我就可以mmd2tex并使用 TexShop 将 tex 文件编译为 PDF 它效果很好 但这个
  • 更新 Mac OS 10.7 的 grep

    我想将 Mac 上的 grep 更新到比 Mac OS 10 7 2 附带的 2 5 1 更新的版本 我的问题是 为 Mac 更新 grep 或任何类似程序 的最佳方法是什么 我可以使用 Fink 或 MacPorts 安装新版本并设置路径
  • 如何从 Mac OS X 导出证书以获得一对 .cert 和 .key 文件?

    我在 Mac 10 10 1 上创建了证书 并且在钥匙串访问证书中拥有私钥 在 Windows 上我必须使用这个 并且我需要 cert 和 key 文件 如何导出该证书以获得这两个文件 我可以导出为 pb12 或 cert 但不能导出为 c
  • webview渲染完成后如何截图

    我想在 webview 渲染完成时截图 以下是我的代码 void webView WebView sender didFinishLoadForFrame WebFrame frame if frame sender mainFrame r
  • 是否可以在 Mac OS X 上构建 FreeGLUT?

    我正在做一些关于 OpenGL 的教程 http www arcsynthesis org gltut Basics Tutorial 2001 html那个使用FreeGLUT http freeglut sourceforge net
  • tmux 标题字符串不执行 shell 命令

    我的中有以下几行 tmux conf set option g set titles on set option g set titles string whoami H PWD S W F I P 这在过去是有效的 但升级到 2 0 后
  • excel 2010刷新BackgroundQuery中运行时错误1004

    我正在尝试用 vba 编写一个脚本 用于将多个文本文件导入 Excel 一张纸 然后将它们绘制在一张图表上 我面临一个问题刷新后台查询命令并出现 1004 运行时错误 我怎样才能解决它 谢谢 埃亚勒 这是我的代码 Sub fring1 Di
  • 如何从 GCD (DispatchQueue) 转换为 Swift async/await?

    我正在关注斯坦福大学的 CS193p 开发 iOS 应用程序在线课程 它使用 Grand Central Dispatch GCD API 来演示多线程 但他们指出 自 WWDC 2021 起 GCD 已大部分被 Swift 新的内置异步

随机推荐

  • C# 中的工作百分比

    我有两个值 其中一个是十进制值 和另一个值 该值将计算该小数值的百分比 例如 10 的 60 6 decimal value1 10 decimal percentage 60 textbox1 text mathsum here toSt
  • 用于词性标记的优秀 Java 库是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 Android 中使列表视图中的项目不可点击

    如何使列表视图中的项目无法单击 我在列表视图中获得了主题和项目 但主题和项目的视图相同 项目可单击 但主题不可单击 如何实现这一目标 该列表看起来像 Topic item Topic item item 话题 单击able false 不起
  • 博客上的随机背景图片

    我正在尝试整理某种代码 以随机化我的博主博客上的背景图像 我的编程技能不足 但我愿意尝试建议 我记得在 WordPress 中实现了类似的功能 通过将 php 代码文件存储在图像文件夹中 然后从 CSS 中调用该 php 文件 就像它是图像
  • 将二进制输出从文件输出重定向到 stdout

    我有一个专有的二进制文件 它顽固地接受两个文件作为参数 第一个作为输入 第二个作为输出 我想 构建第一个参数 不创建临时文件 使二进制写入标准输出而不是输出文件 第二个参数 我解决了第一个问题 lt 但不确定第二个参数 我编写了以下脚本 看
  • jQuery 插件,用于带有自动建议的逗号分隔标签的简单输入框

    我正在寻找具有以下功能的 jQuery 插件 它应该显示一个输入框 其中的标签将如下所示 蜜蜂 珠子 胡须 当用户键入标签时 它应该显示一个自动建议框供用户输入 显示应该简单明了 只是纯文本逗号分隔标签 它应该允许包含空格键的标签 例如 有
  • 使用 ransack 在 Rails ActiveAdmin 中自定义过滤器

    我创建了一个 activeadmin 过滤器 在其下拉菜单中具有以下用于过滤表数据的选项 Choice A Choice B Choice C Choice D 我想添加第五个选项 F 它可以选择 B 或 C 即 B 和 C 的结果 Cho
  • nhibernate:读写字符串列表

    我知道我可以使用 nhibernate 读取写入字符串列表 如下所示 HasMany x gt x Attachments KeyColumn RowId Table PostTable Element PostKey 但这会创建一个额外的
  • 如何使用git-svn切换svn分支?

    复制 如何让 git svn 使用特定的 svn 分支作为远程存储库 https stackoverflow com questions 192736 how do i make git svn use a particular svn b
  • HTML 帮助关键字查找

    我无法弄清楚如何进行关键字查找 HH KEYWORD LOOKUP http msdn microsoft com en us library ms670091 VS 85 aspx 在 HTML 帮助中工作 如果我有一个显示如下的索引 M
  • React-Native:如何定义 JavaScript 类

    我正在使用本机反应 我需要定义一个类 class myClass email string name string constructor setUser fbid string token string boolean 我试图在它自己的文
  • 如何在函数内部定义函子

    有时 我需要一些函子助手来操作列表 我尽量将范围保持在本地 include
  • 存档操作顺序的保证

    我想知道文件 文件系统上的操作顺序是否有任何保证 假设我有一个文件foo dat我更新如下 lseek fd pos a SEEK SET write fd data a size a lt Operation A lseek fd pos
  • Android 支持哪些字体文件类型?

    Android 支持哪些字体文件类型 例如与 Typeface createFromAsset 一起使用 我似乎找不到文档中列出 我可以看到一些教程中提到了 TTF 并且这里有人暗示现在也支持 OTF 但是是否有一个完整的列表显示不同 AP
  • 访问运行配置 VM 参数中 eclipse 类路径变量 M2_REPO 的值

    在 eclipse 的运行配置中 为您提供了一组可以在 VM 参数中使用的默认变量 例如container path and env var 我想要访问的是类路径变量 M2 REPO 但看不到这样做的方法 我需要在 VM 参数中指定 jav
  • 如何将 Django Admin 中的 DateTimeField 格式化为本地时间?

    如何根据本地时间和时区在管理中格式化日期时间字段 我的设置 py TIME ZONE Europe Bratislava LANGUAGE CODE en us USE I18N True USE L10N True USE TZ True
  • 使用 RedirectToAction 时如何设置协议?

    我的目标操作需要 https 我已经有一个过滤器 如果请求通过 http 传入 它会重定向到 https 但我更愿意从一开始就通过 https 发送请求 EDIT Darin 给出了一个答案 现在更新为其他内容 他问为什么我无论如何都通过
  • BASH:将数据从平面文件导入模板

    我有一个平面记录文件 每行有 33 行 我需要将此文件格式化为模板中的规格 模板为 DOS 格式 源文件为 NIX 格式 该模板具有必须遵守的特定缩进和间距 我想到了几个选择 BASH 与经典的 nix 工具 sed awk grep 等
  • 如何在 Bash 中给定超时后终止子进程?

    我有一个 bash 脚本 它启动一个子进程 该进程时不时地崩溃 实际上是挂起 而且没有明显的原因 闭源 所以我对此无能为力 因此 我希望能够在给定的时间内启动此进程 如果在给定的时间内没有成功返回 则将其终止 有没有simple and r
  • dispatch_write() 和dispatch_read() 用法

    我只是在玩一些 GCD 函数来向文件写入和读取数据 其中两个函数是dispatch write and dispatch read 它允许向文件描述符写入和读取数据 而无需设置新的dispatch io t渠道 所以 我有以下代码 impo