【问题标题】:How to get process info programmatically in C/C++ from a Solaris system?如何从 Solaris 系统以 C/C++ 编程方式获取进程信息?
【发布时间】:2010-10-01 12:24:16
【问题描述】:

是否有关于如何在 Solaris 上收集系统和进程信息的 C/C++ 库和文档?

虽然我可以解析命令行工具,但我宁愿使用使任务更容易完成的库。

谢谢

编辑: 有人建议使用 /proc 虚拟目录来收集信息,但它并不比解析命令行工具好多少,因为我需要实现一些对我需要的每条数据进行自定义解析。

我正在寻找类似于 Windows 或 MacOS 的 c 库的东西,它通过基于 c 的系统 API 提供此信息,但是我在 Google 上没有运气。

【问题讨论】:

  • 你需要什么? PID?内存/CPU使用率?磁盘空间?

标签: c++ c process solaris system


【解决方案1】:

您可以通过kstat API 获取此类信息。

man -s 3KSTAT  kstat

您可以在 OpenSolaris vmstatiostat 源代码中看到它是如何使用的。

有关进程的信息,我会查看ps

【讨论】:

    【解决方案2】:

    Solaris 具有/proc virtual directory,它允许您使用文件系统 I/O 函数收集有关进程的各种信息。

    【讨论】:

      【解决方案3】:

      我会按照 CrashWorks 的建议使用 /proc 虚拟目录。我在 aux 和 linux 上都做过这个。要记住的一件事是,当我在 linux 上使用 /proc 目录时,文件的格式因内核而异。

      我不知道 Solaris 方面的情况如何,但这可能意味着您的解决方案无法从一个 Solaris 平台移植到另一个平台。

      【讨论】:

      • Linux 文件往往是文本; Solaris 包含二进制信息。
      • 确实如此。目前在 Solaris 中不能保证稳定的界面,但您可以从 proc.h 和朋友那里获得所需的一切。
      【解决方案4】:

      getrusage() 呢?

      【讨论】:

        【解决方案5】:

        我绝对不是这方面的专家,但我在上学期的一项作业中做了非常相似的事情,当时我们需要对流程进行快照。不幸的是,这种方法需要深入内核,这可能不是您想要做的。

        我发现这个article 很有帮助。

        无论如何这里有一些sn-ps。

         write_lock_irq(&tasklist_lock);
          for_each_process(task) {
        
            if (system_or_user == 0)
              print_mem_user(task);
            if (system_or_user == 1)
              print_mem_system(task);
          }
          write_unlock_irq(&tasklist_lock);
        

        您需要锁定某些数据结构或有时内核会挂起的想法。 “for_each_process”是在某处定义的宏,但我不记得它是如何工作的 D:

        static void print_mem_system(struct task_struct *task)
        {
          struct mm_struct *mm;
        
          if (task -> mm == NULL){ // this is how you distinguish system processes from user processes
            myarraypid[totalnumberofprocesses] = task -> pid; // store process id's into myarraypid[], which you can later copy back to user space for printing/display. Additional information would be found in a "task_struct" which is Linux's implementation of a process. 
        
        
        
          }
        
        
        }
        

        我的一些同学采取了不同的方法,并深入研究了“ps”实用程序的源代码。我相信我正在使用 Linux 2.6.18-92.1.13.e15。免责声明:这对我有用,但您的里程可能会有所不同。我很可能会走投无路,我不想把你引向错误的方向。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-06
          • 1970-01-01
          • 1970-01-01
          • 2023-04-11
          • 1970-01-01
          相关资源
          最近更新 更多