问题标签 [mach]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - OSX内核空间中的uuid.h?
环顾四周后,我没有找到在OSX 内核空间中创建UUID的内置函数。(仅限于Kernel.framework)
有没有我可以使用的替代品?还是我应该只使用时间哈希(MD5/SHA1)?
macos - 为什么 poll 表明一个 kqueue 观察一个空的 Mach 端口集是可读的?
我有一个 kqueue 正在监视一个项目:一个空的 Mach 端口集。kevent64
表示没有可用的事件,并select
表示 kqueue 尚未准备好读取。但是poll
说 kqueue是可读的!kevent64
- 尽管在随后调用以读取假定准备好的事件时,情况似乎并非如此。
我正在使用的代码如下。你可以用类似的东西来构建它gcc -Wall -std=c99 -o test test.c
,然后用它./test
或其他东西运行它。它打印出以下返回值kevent64
:(在尝试读取 1 而无需等待后实际检索到的事件计数)、select
(轮询后准备读取的文件描述符计数)和poll
(轮询后准备读取的文件描述符计数)。
我期望的输出是这样的,表明kevent64
,select
并且poll
所有人都同意 kqueue 是空的。
但我实际上得到的是这个,显示kevent64
并select
说一件事,poll
另一件事 - 而且,即使在poll
表明 kqueue 是可读的之后,kevent64
仍然说没有要读取的事件(这是第二次kevent64
调用的原因)。
revents
( is的 1 值POLLIN
,据说,表示可以在没有阻塞的情况下读取数据。如果我单独指定POLLRDNORM
,结果是相同的POLLRDBAND
。)
为什么会出现差异?
我的测试代码:
plugins - 核心音频用户空间插件驱动程序 - 沙箱防止来自另一个进程的数据交互
我正在开发基于示例 developer.apple.com/library/mac/samplecode/AudioDriverExamples/Introduction/Intro.html 的 coreaudio 用户空间 hal 插件
在插件实现中,我打算从另一个进程即CFMessagePort获取音频数据
但是,我在控制台中尝试创建端口 CFMessagePortCreateLocal 时出现以下错误...
sandboxd[251]: ([2597]) coreaudiod(2597) 拒绝 mach-register com.mycompnay.audio
我做了一些谷歌搜索并来到这篇文章
技术问答 QA1811 https://developer.apple.com/library/mac/qa/qa1811/_index.html 关于在 plist 中添加 AudioServerPlugIn_MachServices 但仍然没有成功。
我还需要做些什么来完成这项工作(比如添加权利、代码签名)或者这不是正确的方法。?我不确定 MessagePort 机制在沙箱下是否可以工作。XPC 服务是否可行?
非常感谢您的宝贵时间。任何帮助是极大的赞赏
更新1:
我应该在音频插件中创建一个远程端口而不是本地端口。话虽如此,使用 plist 中的 AudioServerPlugIn_MachServices 属性。现在没有sandboxd[559]: ([552]) coreaudiod(552)在控制台中拒绝 mach-lookup / register 消息。
但是,在我的音频 hal 插件(客户端)中,我有
CFStringRef port_name = CFSTR("com.mycompany.audio.XPCService");
CFMessagePortRef port = CFMessagePortCreateRemote(kCFAllocatorDefault, port_name);
端口返回值 0。我在不同的应用程序中尝试过这个,它工作得很好。
这是我的服务器端:
我确实收到了关于此的控制台消息。
com.apple.audio.DriverHelper[1314]:名为 SimpleAudioPlugIn.driver 的插件需要扩展名为 com.mycompnay.audio.XPCService 的 mach 服务的沙箱
有谁知道为什么??
更新 2
我注意到,当我将调试模式与 coreaudiod 一起使用时,它确实成功获取了 mach 服务的对象引用。(当我尝试 xpc_service 方法时发生了同样的事情) 项目方案设置
任何人??
c - 无法在 mach 上的子进程和父进程之间发送消息(不是 MacOS)
我正在尝试编写一个小型应用程序,在 Mach 上的“进程”之间发送消息(不是 Mac OS,即使后者源自前者),这是我目前拥有的代码:
运行代码时出现此错误:
任何想法?
c - 无法在两个进程之间发送消息 Mach
我正在尝试在 Mach 上的两个进程之间发送消息(准确地说,这是带有 Mach 微内核的 Debian GNU/Hurd),这是我拥有的代码:
这是 machheader.h:
当我运行应用程序时,它给了我:
这告诉我消息已成功排队,但停在那里并且不会继续从父进程的队列中读取。任何想法?
ios - iOS内核开发
开发到 iOS Mach(内核)的过程(如果有)是什么,当您开发驱动程序并 Microsoft 签署您的驱动程序时,是否有类似于 Windows 的东西?
可以通过应用商店分发吗?
c - 将 mach 端口传递给子进程
我正在尝试将 mach 端口传递给fork
在 Mac OSX 上创建的子进程。我看到了这个 SO question Sharing Mach ports with child processes但它没有解决方案,它只是描述了问题。查看此站点https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html它包含有关将马赫端口传递给子进程的说明,但不幸的是它们不是示例代码。
我尝试实现端口交换,但子进程无法接收父进程发送的消息,mach_msg
内部recv_port
失败并带有invalid name
. 以下是我到目前为止所拥有的。抱歉,有这么多代码,mach IPC 有点让人难以简洁。
那么,既然引导端口黑客不再起作用,我如何将 mach 端口传递给 Mac OSX 上的子进程呢?
编辑
我更改了代码示例以反映 Ken Thomases 在他的回答中提出的观点,子进程创建一个具有发送权限的端口并将其发送给父进程。但是父进程无法接收子进程创建和发送的端口,只能挂起recv_port
。
darwin - 我应该如何调试 Mach 端口泄漏?
我有一个用 c++ 编写的服务器,在 osx 上运行时会泄漏 Mach 端口。具体来说,在运行时top
我注意到它有大约 50000 (under #PORTS
) 。奇怪的是,我让它在一夜之间运行,第二天机器基本上死了(花了 15 分钟来响应 ctrl-c,不接受新的 ssh 连接)所以 IT 不得不重新启动它。这样的泄漏会导致这样的系统崩溃吗?它没有以root身份运行。
无论如何,寻找这种泄漏原因的一些好的策略是什么?有什么好的工具吗?
我发现一项测试在运行时可靠地泄漏了 5 个端口,但仅此而已。
编辑:我发现我们的线程类创建了一个马赫端口泄漏,但我不明白为什么。在构造函数中,我们有以下代码:
而且我注意到在调用 to 之后进程的端口数增加了 1 pthread_create
,这是预期的。
然后,稍后我使用以下代码加入线程:
并且没有抛出异常,所以我只能假设pthread_join
返回 0 并因此成功,但顶部的端口数不会下降。我还需要做些什么来清理线程吗?
python - 在 OS X 中运行进程,找到启动器进程
我想创建一个守护进程(基于脚本或一些较低级别的语言),根据它们的启动过程计算所有打开的应用程序的统计信息。问题是启动进程并不总是等同于实际的父进程。
例如,当我按下 Microsoft Word 中的超链接时,它应该打开可执行文件,例如 file:///Applications/Chess.app/
在上面的例子中,我观察到“Chess”的 ppid 实际上是“launchd”,就像我从启动板运行它一样。
也许有一个 mach_port(或任何其他)api 来确定谁真正启动了应用程序?
c - 在 XNU 项目中找到 __proc_info 符号
我想弄清楚 VMMAP 进程是如何运作的。
使用 dtrace 运行此可执行文件后,似乎是提取虚拟内存中每个部分的地址空间的方法 proc_regionfilename。
所以,我挖得更深了,在 xnu 中的
libsyscall/wrappers/libproc/libproc.c文件下找到了它的实现
在函数体中,我看到主要调用是 proc_pidinfo :
而 proc_pidinfo 又调用 __proc_info 符号:
但是,在代码中找不到这个符号,我想知道它是如何在预编译、编译、链接或实时过程中创建的。
知道我在哪里可以找到它,或者它是如何创建的(我还没有尝试编译内核)。
谢谢