我正在从 /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,我想获取它发送数据的主机名和端口。
Uid:
中的/proc/PID/status
字段确实是你想要的。然而,Linux 并不只有一个分配给进程的 UID,而是 4 个:
这也是
/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位无符号整数。