有谁知道在 ubuntu 上为 arm 在 gcc 上编译 darwin 库的步骤吗?
根据我阅读的文档和xnu源代码,我了解到Mac OS X 使用统一缓冲区缓存(UBC)缓存文件 I/O. UBC根据可用的RAM增长尽可能大,但UBC页面是内存越来越紧张时首先被牺牲的页面.
在我的驱动程序中,我处理各种磁盘元数据.我希望能够使用UBC或类似的机制来保持MRU缓存这些数据以加快速度,同时让内核能够在需要时收回内存.然而,元数据不代表文件数据,因此不直接落入UBC的域.是否有我可以使用的低级机制,或者我可以以某种方式仅使用UBC中处理缓冲区本身的部分?
我目前正在寻找HFS +源代码,试图弄清楚它是否以及如何缓存文件系统元数据,尽管没有太大的成功.
主要的替代方案当然是为缓存保留特定的内存区域并进行自己的LRU剔除.我可以选择一个固定的缓存大小或者使用某种启发式方法,但是当RAM丰富时它总是会占用太少的内存,而当它没有时它会占用太多的内存.
更新:
在搜索了一些之后,我发现IOBufferMemoryDescriptor可以使用该kIOMemoryPurgeable选项创建实例.这允许你调用IOMemoryDescriptor::setPurgeable()它来标记内存"公平游戏"以便丢弃.我会尝试并用结果更新问题.
我有一些代码使用ctypes来尝试确定指向的文件sys.stdout是否实际 stdout.我知道在任何符合POSIX标准的系统上,甚至在Windows上,如果这样做应该是安全的sys.stdout.fileno() == 1,所以我的问题不是如何做到这一点.
在我的代码中(已经将ctypes用于与我的问题无关的东西)我不小心有类似的东西:
libc = ctypes.CDLL(ctypes.util.find_library('c'))
real_stdout = libc.fileno(ctypes.c_void_p.in_dll(libc, 'stdout'))
if sys.stdout.fileno() == real_stdout:
...
Run Code Online (Sandbox Code Playgroud)
这在Linux上完全正常,所以我并没有真正考虑它.它比硬编码1作为文件描述符看起来更好,更易读.但几天后我发现我的代码不能用于OSX.
它结束了OSX的libc不会导出任何名为'stdout'的符号.相反,它的stdio.h将stdout定义为:
#define stdout __stdoutp
Run Code Online (Sandbox Code Playgroud)
如果我将代码更改为c_void_p.in_dll(libc, '__stdoutp')我的代码按预期工作,但当然这只是OSX.事实证明,Windows有一个类似的问题(至少如果使用MSVC).
我可能只是改变我要使用的代码1,但我的问题仍然存在,出于好奇,如果有一种跨平台的方式来获取stdio指针(以及同样stdin和stderr)而不假设它使用符合POSIX的描述符?
我对 Go 甚至 Linux 都很陌生。
我在 Linux 环境中构建了一个应用程序,它使用基于 cgo 的 gtk 库(https://github.com/mattn/go-gtk/)。该应用程序在其本机环境(linux 64 位)中构建良好,但是当我尝试针对 darwin 64 位进行编译时,我得到以下结果:
# net
could not determine kind of name for C.AI_MASK
# net
could not determine kind of name for C.AI_MASK
Run Code Online (Sandbox Code Playgroud)
我用来构建的命令行:
env GOOS=$1 GOARCH=$2 CGO_ENABLED=1 go build $3
Run Code Online (Sandbox Code Playgroud)
其中 $1 是 darwin,$2 是 amd64($3 是我的应用程序的路径)。
由于错误似乎来自我导入的库,因此我不确定如何修复它。我还读到,交叉编译 cgo 并不能真正工作,因为它依赖于本机 macOS 的东西,因此需要在 mac 上构建。这是真的吗?或者我可以做些什么来让它在我的环境中发挥作用?
我也有点困惑,因为似乎大多数讨论这个主题的人都在谈论 go pre 1.5,如果我理解正确的话,在交叉编译方面这是完全不同的。
谢谢
应用程序配置为在后台接收位置更新,以便在应用程序处于后台时保持应用程序处于活动状态并成功接收更新.
Darwin通知也已配置,仅在应用程序是前台的当前应用程序时才会收到.一旦应用程序被置于后台,它就会停止接收达尔文通知.
有关如何在应用程序处于后台时收到Darwin通知的任何想法?
代码片段如下.
在Swift2中构建应用程序
在appdeligate中
let callback: @convention(c)
(CFNotificationCenter!, UnsafeMutablePointer<Void>, CFString!, UnsafePointer<Void>, CFDictionary!) -> Void = {
(center, observer, name, object, userInfo) in
//Execute callback code
}
let exCb: CFNotificationCallback = unsafeBitCast(callback, CFNotificationCallback.self)
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),nil ,exCb,"com.apple.springboard.hasBlankedScreen" as CFString,nil ,CFNotificationSuspensionBehavior.DeliverImmediately)
Run Code Online (Sandbox Code Playgroud)
在viewcontroller中
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
//locationManager.requestWhenInUseAuthorization()
locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()
Run Code Online (Sandbox Code Playgroud) mmapDarwin 的联机帮助页指定,为了与mmap超级页面(Darwin 相当于 Linux 的大页面)一起使用,VM_FLAGS_SUPERPAGE_SIZE_*应该使用标志。
我尝试在 Rust 中使用此功能,但在 Darwin 的 Rust libc 版本( i686、x86_64 )中找不到这些常量。
macOS(在 Darwin / Mach / IOKit 中的某处)中对应/dev/input于 Linux中的低级键盘设备的名称是什么?(例如/dev/input/event0)
上下文:我之所以这么问是因为想将 Mac 设备“映射”到运行 Linux 的 Docker 容器。
在分析崩溃报告时,我看到了一个Non UI我以前从未见过的角色。我试图了解它对应的应用程序的状态。
Hardware Model: iPhone7,2
Code Type: ARM-64 (Native)
Role: Non UI
Parent Process: launchd [1]
OS Version: iPhone OS 11.4 (15F79)
Report Version: 104
Run Code Online (Sandbox Code Playgroud)
在Role头文件中提到这里,它指向内核源代码。在源代码的最新可用版本(以及以前的版本)中,我看到了一个TASK_NONUI_APPLICATION枚举常量,但它没有记录。
已经有一个TASK_FOREGROUND_APPLICATION和一个TASK_BACKGROUND_APPLICATION常量,所以我不明白Non UI(或TASK_NONUI_APPLICATION)可以是什么。
我在 mac 上运行了一个“helloworld”来尝试 GDB,但是在输入 run it 输出后
[New Thread 0x1903 of process 69034]
Run Code Online (Sandbox Code Playgroud)
然后什么都没有。
我已经等了一个小时,还是什么都没有。完成认证并禁用带外壳启动。
系统:MacOS Catalina 10.15.4 GNU gdb (GDB) 9.1
我通常启动长时间运行的 shell 脚本的方式是
\n\n% (nohup ./script.sh </dev/null >script.log 2>&1 & )\nRun Code Online (Sandbox Code Playgroud)\n\n重定向关闭stdin,然后重新stdout打开stderr;nohup当所属进程退出时,停止 HUP 到达该进程(我意识到这有点2>&1多余,因为nohup无论如何它都会做类似的事情);子 shell 中的后台是双叉,这意味着./script.sh进程的父进程在仍在运行时已退出,因此它获取 init 进程作为其父进程。
然而,这并不完全有效,因为当我退出调用它的 shell 时(当然,通常我是在远程计算机上执行此操作),它不会完全退出。我可以^C退出,这是可以的 \xe2\x80\x93 该进程确实按预期在后台进行。然而,我无法弄清楚需要/不发生什么^C,这让我很恼火。
上面的操作似乎勾选了unix FAQ(问题 1.7)中的大部分框,除了我没有做任何事情来将该进程与控制终端分离,或者使其成为会话领导者。FreeBSD 上存在setsid(2) 调用,但不存在该setsid命令;据我所知,也没有明显的替代命令。当然,在 macOS 上也是如此。
所以,问题是:
\n\nsetsid这个平台上是否有我失踪的不同名称的呼叫者?^C?有什么办法可以咬我吗?