OSX:proc_pidinfo 对于其他用户的进程返回 0

2023-12-31

我需要获取有关在 Mac OSX 上运行进程的一些信息(PID、UID、GID、进程名称)。我试过proc_pidinfo。对于我自己的流程来说,它工作得很好。但是,对于其他用户拥有的进程,则返回 0。没有关于此功能的文档,但根据网上找到的资料 http://vinceyuan.github.io/wrong-info-from-procpidinfo/,它应该返回写入提供的缓冲区的字节数。在其他用户进程上调用此函数将返回 0,这意味着未提供任何信息。

Example:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <libproc.h>


int main(int argc, char *argv[])
{
    pid_t pid;
    struct proc_bsdinfo proc;

    if (argc == 2)
        pid = atoi(argv[1]);
    else
        pid = getpid();

    int st = proc_pidinfo(pid, PROC_PIDTBSDINFO, 0,
                         &proc, PROC_PIDTBSDINFO_SIZE);

    if (st != PROC_PIDTBSDINFO_SIZE) {
        fprintf(stderr, "Cannot get process info");
        return 1;
    }
    printf(" pid: %d\n", (int)proc.pbi_pid);
    printf("ppid: %d\n", (int)proc.pbi_ppid);
    printf("comm: %s\n",      proc.pbi_comm);
    printf("name: %s\n",      proc.pbi_name);
    printf(" uid: %d\n", (int)proc.pbi_uid);
    printf(" gid: %d\n", (int)proc.pbi_gid);

    return 0;
}

运行这个程序会产生:

 $ ./pidinfo
 pid: 30519
ppid: 8434
comm: pidinfo
name: pidinfo
 uid: 501
 gid: 20
 $ ./pidinfo 1
Cannot get process info
 $ sudo ./pidinfo 1
 pid: 1
ppid: 0
comm: launchd
name: launchd
 uid: 0
 gid: 0

这很奇怪,因为我可以从ps(1)。但后来我检查了两者ps and topOSX 上是 SUID 二进制文件,这符合proc_pidinfo行为:

 $ ls -l `which ps` `which top`
-rwsr-xr-x  1 root  wheel  51008  5 maj 08:06 /bin/ps
-r-sr-xr-x  1 root  wheel  87952  5 maj 08:05 /usr/bin/top

但是,活动监视器无需 SUID 即可工作。

所以,我的问题是,为什么proc_pidinfo仅提供有关我自己的流程的信息?我可以让它提供有关其他流程的信息吗?如果没有,我如何在不解析的情况下获取这些信息ps(1) output?


我发现 macOS Mojave(版本 10.14.4)有struct proc_bsdshortinfo,这是一个子集struct proc_bsdinfo。您可以通过使用它来获取没有 SUID 的其他用户的进程,而不是struct proc_bsdinfo.

嗯,我不知道它是从哪个版本可用的。

edited:它至少自 macOS 10.10.5 (Yosemite) 起可用。
再次编辑:它可能从 Mac OS X 10.7 (Lion) 开始可用,因为 tmux 使用struct proc_bsdshortinfo if __MAC_10_7被定义为。看here https://github.com/tmux/tmux/blob/e6ee3e9504e0abc9014e1b20ac6a9c43dd6145fb/osdep-darwin.c#L40-L41.

Example:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <libproc.h>

int main(int argc, char *argv[])
{
    pid_t pid;
    struct proc_bsdshortinfo proc;

    if (argc == 2)
        pid = atoi(argv[1]);
    else
        pid = getpid();

    int st = proc_pidinfo(pid, PROC_PIDT_SHORTBSDINFO, 0,
                         &proc, PROC_PIDT_SHORTBSDINFO_SIZE);

    if (st != PROC_PIDT_SHORTBSDINFO_SIZE) {
        fprintf(stderr, "Cannot get process info\n");
        return 1;
    }
    printf(" pid: %d\n", (int)proc.pbsi_pid);
    printf("ppid: %d\n", (int)proc.pbsi_ppid);
    printf("comm: %s\n",      proc.pbsi_comm);
    //printf("name: %s\n",      proc.pbsi_name);
    printf(" uid: %d\n", (int)proc.pbsi_uid);
    printf(" gid: %d\n", (int)proc.pbsi_gid);

    return 0;
}

该程序打印:

$ ./pidinfo 
 pid: 3025
ppid: 250
comm: pidinfo
 uid: 501
 gid: 20
$ ./pidinfo 1
 pid: 1
ppid: 0
comm: launchd
 uid: 0
 gid: 0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OSX:proc_pidinfo 对于其他用户的进程返回 0 的相关文章

  • 如何在 .NET Framework 2.0 中模拟“Func<(Of <(TResult>)>) 委托”?

    我尝试使用这个类代码项目文章 http www codeproject com KB threads AsyncVar aspx在 VB NET 和 NET Framework 2 0 中 除了这一行之外 所有内容似乎都可以编译Privat
  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • ClickOnce 应用程序错误:部署和应用程序没有匹配的安全区域

    我在 IE 中使用 FireFox 和 Chrome 的 ClickOnce 应用程序时遇到问题 它工作正常 异常的详细信息是 PLATFORM VERSION INFO Windows 6 1 7600 0 Win32NT Common
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • 外键与独立关系 - Entity Framework 5 有改进吗?

    我读过了several http www ladislavmrnka com 2011 05 foreign key vs independent associations in ef 4 文章和问题 https stackoverflow
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • AES 128 CBC 蒙特卡罗测试

    我正在 AES 128 CBC 上执行 MCT 如中所述http csrc nist gov groups STM cavp documents aes AESAVS pdf http csrc nist gov groups STM ca
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • 对 Mac“捆绑”文件进行版本控制的最佳方法

    所以你知道很多 Mac 应用程序都使用 捆绑包 对于你的应用程序来说 它看起来像是一个文件 但实际上它是一个包含许多文件的文件夹 对于要处理此问题的版本控制系统 它需要 检出目录中的所有文件 以便应用程序可以根据需要修改它们 at chec
  • 如何在非控制台应用程序中查看 cout 输出?

    输出到调试窗口似乎相当繁琐 我在哪里可以找到cout如果我正在编写非控制台信息 则输出 Like double i a b cout lt lt b lt lt endl I want to check out whether b is z
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • ansible unarchive 模块如何查找 tar 二进制文件?

    我正在尝试执行一个 ansible 剧本 该剧本的任务是利用unarchive模块 因为我是在 OSX 上执行此操作 所以我需要使用它gnu tar 而不是bsd tar通常与 OSX 一起提供 因为BSD tar 不受官方支持 https
  • Oracle Data Provider for .NET 不支持 Oracle 19.0.48.0.0

    我们刚刚升级到 Oracle 19c 19 3 0 所有应用程序都停止工作并出现以下错误消息 Oracle Data Provider for NET 不支持 Oracle 19 0 48 0 0 我将 Oracle ManagedData

随机推荐

  • 从 ConcurrentDictionary 中安全删除列表映射[重复]

    这个问题在这里已经有答案了 我有一个 ConcurrentDictionary 它将简单类型映射到列表 var dict new ConcurrentDictionary
  • 计算卷积的最快方法

    我必须对许多图像的每一行应用卷积滤波器 经典的是 1024x1024 像素的 360 度图像 在我的用例中 它是 720 张 560x600 像素的图像 问题是我的代码比文章中宣传的慢得多 我实现了朴素卷积 需要2m 30s 然后我使用 f
  • Perl 子例程数组和标量变量参数

    我到底如何将标量变量和数组变量传递给 Perl 中的子例程 my currVal 1 my currValTwo 1 my currArray one two three my currArrayTwo one two three mysu
  • 交换 PostgreSQL 中的列值

    In my PostgreSQL数据库 我有一个包含两个文本值的表 t1 and t2 id t1 t2 1 abcd xyz 2 aazz rst 3 fgh qwerty 我想交换列的值t1 and t2对于表中的每一行 使用上面的示例
  • Chrome远程调试显示设备但不检查链接

    我想在 Chrome 上远程调试 Android 应用程序 我的设备是 Qmobile A11 Note 配备 Android v4 0 4 Google Chrome v42 和 Cordova v3 7 我已在我的设备上启用 USB 调
  • Android:将变量传递给已运行的服务

    我在将值从活动传递到已运行的服务时遇到问题 我想知道最好的方法是什么 添加额外内容不起作用 因为我相信这必须在意图开始之前完成 如我错了请纠正我 任何帮助都会很棒 如果需要的话我可以详细说明 Dan 如果您的服务不是IntentServic
  • 如何将 NTLM 身份验证与 Active Directory 结合使用

    我正在尝试在我们的内部站点之一上实施 NTLM 身份验证 一切正常 我不知道的一个难题是如何从 NTLM 获取信息并使用 Active Directory 进行身份验证 有一个NTLM 的良好描述 http www innovation c
  • PHP 关闭:无法写入文件?

    我使用 Log 类在执行期间存储消息 然后应该在关闭时将这些消息写入文件 使用 register shutdown function 但由于某种原因 我总是收到 file put contents 无法打开流 没有这样的文件或目录 文件不存
  • 使 Visual Studio 在项目文件更改时自动重新加载解决方案

    在我正在处理的当前项目中 目前存在大量代码变动 这意味着从源代码管理进行更新有时可能意味着许多 csproj 文件更改 众所周知 VS2010没有 Reload all 按钮 但是你必须重新加载每个项目并确认每次重新加载 有没有一种方法可以
  • 我想将 sqlite3 db 从内存复制到硬盘。我能怎么做? [复制]

    这个问题在这里已经有答案了 我想将 sqlite 数据库从内存复制到硬盘 我能怎么做 我尝试这样 conn phy sqlite3 connect phy db conn sqlite3 connect memory c conn curs
  • OpenCV C/C++ 中仅过滤出一个轮廓

    我正在尝试编写一个程序 使用基于 Canny 过滤器和轮廓查找功能的摄像机 网络摄像头来检测任何形状的物体 这是我的程序 int main int argc char argv CvCapture cam CvMoments moments
  • 自定义异常过滤器在 asp.net MVC 中未被命中

    我有一个自定义异常过滤器 用于捕获我编写的自定义异常 但由于某种原因 当我抛出异常时 它永远不会到达过滤器 相反 我只是收到一个错误 表明我的异常未由用户代码处理 任何人都可以提供一些关于我应该如何设置的建议 帮助吗 相关代码如下 cont
  • 在 QT 中显示(渲染)字符串中的 HTML

    我在 QString 中有 html 我可以使用什么小部件来显示它 QWebView不是必需的 因为我不访问互联网 QWebView http doc qt io qt 4 8 qwebview htmls setHtml http doc
  • ReSharper:查找可选参数的用法

    如果我有一个带有可选参数的函数 是否有一种简单的方法可以找到我的代码中调用该函数并将值传递给该参数的所有位置 该函数有许多非默认参数 因此扫描调用该函数的位置的通常查找用法结果是有问题的 因为它会修剪行 并且我看不到是否使用了可选参数 Wi
  • 快速获得多个链表的部分排序的算法

    我有一个情况 如下 I have n双向链表 每个列表都有一个哨兵开始和结束 这些列表都有same开始和结束节点 不是必需的 但为了简单起见 这些列表是同质的并且可能共享项目 我想找到所有节点的部分排序n列表 从开始节点开始 到结束节点结束
  • JMSTemplate 中的 setSessionTransacted 到底意味着什么?

    如果我正确理解 Spring 文档 请解释一下 Spring 文档指出 https docs spring io spring docs current spring framework reference integration html
  • 具有相同名称的多个文本输入 - 添加到数据库

    我有一个包含多个字段的表单 所有字段都可以相乘
  • 大 O 表示法运行时

    我已经得到了一些代码来计算它们的大 O 运行时间 有人可以告诉我我是否走在正确的轨道上吗 program1 int i count 0 n 20000 for i 0 i lt n n i count 那是 O n 2 吗 number2
  • 在 PHP 中创建新线程(?)[重复]

    这个问题在这里已经有答案了 可能的重复 php执行后台进程 https stackoverflow com questions 45953 php execute a background process 我怎样才能实现应该在 php 线程
  • OSX:proc_pidinfo 对于其他用户的进程返回 0

    我需要获取有关在 Mac OSX 上运行进程的一些信息 PID UID GID 进程名称 我试过proc pidinfo 对于我自己的流程来说 它工作得很好 但是 对于其他用户拥有的进程 则返回 0 没有关于此功能的文档 但根据网上找到的资