我正在编写一个程序来暴露macOS上其他pids的参数。我已经做了KERN_PROCARGS2
sysctl
,但结果发现每个人和他们的狗都用错了这个。包括苹果的ps
和谷歌的Chrome。exec
家族的函数都允许你以argv[0]
的形式传递空字符串。这种情况下,向前跳过返回缓冲区中exec_path
后面的NULL
的标准方法不起作用,因为最后一个NULL
实际上是一个空字符串的终止字符,所以你跳过了一个你不想跳过的参数,这会导致将env var作为参数输出(我已经在许多程序中证实了这种行为)。
为了正确地执行这个操作,必须计算要跳过多少个空值,而不是每次都跳过它们。在Web上有引用返回的缓冲区的不同部分是指针对齐的,但是无论我尝试使用len % 8
检查缓冲区的哪个部分,我都没有得到正确的填充NULL
的计数。
- https://github.com/apple/darwin-xnu/blob/main/bsd/kern/kern_sysctl.c#L1528
- https://lists.apple.com/archives/darwin-kernel/2012/Mar/msg00025.html
- https://chromium.googlesource.com/crashpad/crashpad/+/refs/heads/master/util/posix/process_info_mac.cc#153
1条答案
按热度按时间xoefb8l81#
我写了一个库来正确地做到这一点:https://getargv.narzt.cam