Unix Proc目录
我正在尝试查找包含当前用户ID的虚拟文件。有人告诉我可以在proc目录中找到它,但不太确定是哪个文件。
解决方案
我不确定可以在/ proc
中找到它。我们可以尝试使用getuid()
函数或者$$ USER环境变量。
为什么不只使用"id -u
"?
我们很可能想要检查$ USER环境变量。其他选项包括getuid
和id -u
,但是搜索/ proc
当然不是最好的操作方法。
据我所知,/ proc
是特定于Linux的,通常不是在UNIX中。如果我们真的只想要当前的UID,请使用getuid()
或者geteuid()
函数。
如果我们知道仅使用Linux,则可以浏览/ proc / self / *
下的层次结构,其中包含有关当前进程的各种信息。请记住,/ proc
是"神奇的",它是内核服务的虚拟文件系统,其内容在我们请求时动态生成。因此,它可以返回特定于当前进程的信息。
例如,尝试以下命令:cat / proc / self / status
在/ proc / process_id / status
中(至少在Linux上),我们会发现这样的一行:
Uid: 1000 1000 1000 1000
这会告诉我们该进程正在其帐户下运行的用户的uid。
但是,要找出当前进程的进程ID,我们将需要系统调用,然后我们也可以调用getuid
直接获取uid。
编辑:啊,`/ proc / self / status ......每天都在学习新东西!
我们实际上需要/ proc / self / status
,它将为我们提供有关当前执行的进程的信息。
这是一个例子:
$ cat /proc/self/status Name: cat State: R (running) Tgid: 17618 Pid: 17618 PPid: 3083 TracerPid: 0 Uid: 500 500 500 500 Gid: 500 500 500 500 FDSize: 32 Groups: 10 488 500 VmPeak: 4792 kB VmSize: 4792 kB VmLck: 0 kB VmHWM: 432 kB VmRSS: 432 kB VmData: 156 kB VmStk: 84 kB VmExe: 32 kB VmLib: 1532 kB VmPTE: 24 kB Threads: 1 SigQ: 0/32268 SigPnd: 0000000000000000 ShdPnd: 0000000000000000 SigBlk: 0000000000000000 SigIgn: 0000000000000000 SigCgt: 0000000000000000 CapInh: 0000000000000000 CapPrm: 0000000000000000 CapEff: 0000000000000000 Cpus_allowed: 00000003 Mems_allowed: 1 voluntary_ctxt_switches: 0 nonvoluntary_ctxt_switches: 3
我们可能想要查看Uid和Gid行上的第一个数字。我们可以通过查看/ etc / passwd
来查找哪个uid编号映射到哪个用户名,或者调用相关函数以将uid映射到使用任何语言的用户名。
理想情况下,我们只需调用系统调用getuid()
来查找此信息,通过查看/ proc /
会适得其反。
我们正在寻找的东西可能在环境变量中。在检查环境变量时,需要注意所使用的外壳程序。 bash使用" UID",而tcsh使用" uid",在* nix
情况下很重要。我还发现tcsh设置了" gid",但是在bash中找不到匹配的变量。