问题标签 [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.

0 投票
1 回答
534 浏览

c++ - OSX内核空间中的uuid.h?

环顾四周后,我没有找到在OSX 内核空间中创建UUID的内置函数。(仅限于Kernel.framework

有没有我可以使用的替代品?还是我应该只使用时间哈希(MD5/SHA1)?

0 投票
0 回答
194 浏览

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(轮询后准备读取的文件描述符计数)。

我期望的输出是这样的,表明kevent64select并且poll所有人都同意 kqueue 是空的。

但我实际上得到的是这个,显示kevent64select说一件事,poll另一件事 - 而且,即使在poll表明 kqueue 是可读的之后,kevent64仍然说没有要读取的事件(这是第二次kevent64调用的原因)。

revents( is的 1 值POLLIN,据说,表示可以在没有阻塞的情况下读取数据。如果我单独指定POLLRDNORM,结果是相同的POLLRDBAND。)

为什么会出现差异?

我的测试代码:

0 投票
1 回答
2251 浏览

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 方法时发生了同样的事情) 项目方案设置

任何人??

0 投票
0 回答
446 浏览

c - 无法在 mach 上的子进程和父进程之间发送消息(不是 MacOS)

我正在尝试编写一个小型应用程序,在 Mach 上的“进程”之间发送消息(不是 Mac OS,即使后者源自前者),这是我目前拥有的代码:

运行代码时出现此错误:

任何想法?

0 投票
1 回答
445 浏览

c - 无法在两个进程之间发送消息 Mach

我正在尝试在 Mach 上的两个进程之间发送消息(准确地说,这是带有 Mach 微内核的 D​​ebian GNU/Hurd),这是我拥有的代码:

这是 machheader.h:

当我运行应用程序时,它给了我:

这告诉我消息已成功排队,但停在那里并且不会继续从父进程的队列中读取。任何想法?

0 投票
1 回答
813 浏览

ios - iOS内核开发

开发到 iOS Mach(内核)的过程(如果有)是什么,当您开发驱动程序并 Microsoft 签署您的驱动程序时,是否有类似于 Windows 的东西?

可以通过应用商店分发吗?

0 投票
2 回答
3228 浏览

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

0 投票
1 回答
1007 浏览

darwin - 我应该如何调试 Mach 端口泄漏?

我有一个用 c++ 编写的服务器,在 osx 上运行时会泄漏 Mach 端口。具体来说,在运行时top我注意到它有大约 50000 (under #PORTS) 。奇怪的是,我让它在一夜之间运行,第二天机器基本上死了(花了 15 分钟来响应 ctrl-c,不接受新的 ssh 连接)所以 IT 不得不重新启动它。这样的泄漏会导致这样的系统崩溃吗?它没有以root身份运行。

无论如何,寻找这种泄漏原因的一些好的策略是什么?有什么好的工具吗?

我发现一项测试在运行时可靠地泄漏了 5 个端口,但仅此而已。

编辑:我发现我们的线程类创建了一个马赫端口泄漏,但我不明白为什么。在构造函数中,我们有以下代码:

而且我注意到在调用 to 之后进程的端口数增加了 1 pthread_create,这是预期的。

然后,稍后我使用以下代码加入线程:

并且没有抛出异常,所以我只能假设pthread_join返回 0 并因此成功,但顶部的端口数不会下降。我还需要做些什么来清理线程吗?

0 投票
1 回答
76 浏览

python - 在 OS X 中运行进程,找到启动器进程

我想创建一个守护进程(基于脚本或一些较低级别的语言),根据它们的启动过程计算所有打开的应用程序的统计信息。问题是启动进程并不总是等同于实际的父进程。

例如,当我按下 Microsoft Word 中的超链接时,它应该打开可执行文件,例如 file:///Applications/Chess.app/

在上面的例子中,我观察到“Chess”的 ppid 实际上是“launchd”,就像我从启动板运行它一样。

也许有一个 mach_port(或任何其他)api 来确定谁真正启动了应用程序?

0 投票
1 回答
698 浏览

c - 在 XNU 项目中找到 __proc_info 符号

我想弄清楚 VMMAP 进程是如何运作的。

使用 dtrace 运行此可执行文件后,似乎是提取虚拟内存中每个部分的地址空间的方法 proc_regionfilename。

所以,我挖得更深了,在 xnu 中的
libsyscall/wrappers/libproc/libproc.c文件下找到了它的实现

在函数体中,我看到主要调用是 proc_pidinfo :

而 proc_pidinfo 又调用 __proc_info 符号:

但是,在代码中找不到这个符号,我想知道它是如何在预编译、编译、链接或实时过程中创建的。

知道我在哪里可以找到它,或者它是如何创建的(我还没有尝试编译内核)。

谢谢