如何获取特定用户运行的进程列表?

问题描述 投票:0回答:1

我正在从 /proc/ 读取正在运行的进程列表。从文件(状态)中,我获得了有关该过程的一些信息。 我需要知道启动该进程的用户 ID。在状态文件中,我看到两个我感兴趣的字段:uid 和 gid。上网查了一下,发现uid是用户标识,gid是组标识。 请告诉我如何将值读入uid_t类型?那么我可以将它与从 geteuid() 函数获得的值进行比较吗? 我需要从进程列表中仅选择由特定用户启动的进程。

这就是我目前从 /proc/status 文件读取信息的方式:

ProcessInfo getInfoFromFileByPID(char pid[], const char* filename)
{
   printf("getInfoFromFileByPID param = %s %s\n", pid, filename);
 
   char            path[256];
   FILE*           fp;
   char            szFullLine[256];
   size_t          len;
   ProcessInfo     process;
   uid_t uid       = geteuid();  // получим идентификатор текущего пользователя
 
 
   snprintf(path, sizeof(path), filename, pid);
 
   fp = fopen(path, "r");
   if (fp)
   {
       memset(szFullLine, 0x00, sizeof(szFullLine));
       len = fread(szFullLine, sizeof(char), sizeof(szFullLine), fp);
       fclose(fp);
 
 
       if( len > 0 )
       {
 
           std::string str(szFullLine);
           std::map<std::string, std::string> map = mappify(str);
 
 
           if (map.find("Name") != map.end())
               process.Name = map["Name"];
           if (map.find("Pid") != map.end())
               process.PID = std::stoi(map["Pid"]);
 
 
           std::cout << "info: " << str << std::endl;
           return process;
       }
   }
   return process;
}

请告诉我在哪里可以找到该进程使用的 IP 地址和端口?例如,如果我启动了 Skype,我想获取它发送数据的主机名和端口。

c++ linux api proc
1个回答
0
投票

Uid:
中的
/proc/PID/status
字段确实是你想要的。然而,Linux 不仅为进程分配了一个 UID,而是 4 个:

  • 真实用户id
  • 有效用户id
  • 已保存的设定用户id
  • 文件系统访问用户 ID

这也是

/proc/PID/status

中数字的顺序

除非您在权限方面做了一些奇怪的事情,否则您“最有可能”想要使用的是真实用户 ID(第一个字段)或有效用户 ID(第二个字段)。 (getuid()返回真实用户id,

geteuid()
返回有效用户id。)
因此,在桌面 Linux 系统上,您很可能会在表单中看到一行

Uid: 1000 1000 1000 1000

如果您拆分该字符串并采用第一个数字,则该数字将是您的真实用户 ID,第二个数字将是有效用户 ID。例如,当您运行 
sudo -i

时,将具有以下用户 ID:

Uid:    1000      0       0       0

真实用户id
1000

表示id为

1000
的用户启动了该程序,但其他id设置为
0
表示该程序实际上具有root权限。 (根始终是 uid
0
。)
至于你问题的另一部分:

uid_t

只是一个整数类型,在现代Linux系统上通常是

unsigned int
,它是一个32位无符号整数。
    

© www.soinside.com 2019 - 2024. All rights reserved.