Unix Proc Directory - PullRequest
       20

Unix Proc Directory

5 голосов
/ 18 сентября 2008

Я пытаюсь найти виртуальный файл, содержащий идентификатор текущего пользователя. Мне сказали, что я могу найти его в каталоге proc, но не совсем уверен, какой файл.

Ответы [ 7 ]

8 голосов
/ 18 сентября 2008

Вы действительно хотите /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. Вы можете посмотреть, какие номера uid соответствуют какому имени пользователя, посмотрев на /etc/passwd или вызвав соответствующие функции для сопоставления uid с именем пользователя на любом используемом вами языке.

В идеале вы должны просто позвонить системному вызову getuid(), чтобы посмотреть эту информацию, а сделать это, посмотрев на /proc/, контрпродуктивно.

6 голосов
/ 18 сентября 2008

Почему бы просто не использовать "id -u"?

3 голосов
/ 18 сентября 2008

Насколько я знаю, /proc специфичен для Linux, но не для UNIX вообще. Если вы действительно хотите текущий UID, используйте функцию getuid() или geteuid().

Если вы знаете, что будете работать только в Linux, вы можете изучить иерархию в разделе /proc/self/*, она содержит различную информацию о текущем процессе. Помните, что /proc является «магическим», это виртуальная файловая система, которую обслуживает ядро, и содержимое генерируется динамически в момент, когда вы запрашиваете его. Поэтому он может возвращать информацию, специфичную для текущего процесса.

Например, попробуйте эту команду: cat /proc/self/status

3 голосов
/ 18 сентября 2008

Я не уверен, что можно найти в /proc. Вы можете попробовать использовать функцию getuid() или переменную окружения $USER.

2 голосов
/ 18 сентября 2008

Скорее всего, вы либо хотите проверить переменную окружения $USER. Другие варианты включают getuid и id -u, но поиск /proc, безусловно, не лучший способ действия.

1 голос
/ 18 сентября 2008

В /proc/<em>process_id</em>/status (по крайней мере, в Linux) вы найдете строку, подобную этой:

Uid:      1000    1000    1000    1000

Здесь указывается uid пользователя, под учетной записью которого запущен процесс.

Однако, чтобы узнать идентификатор текущего процесса, вам потребуется системный вызов, а затем вы можете также вызвать getuid, чтобы получить идентификатор пользователя напрямую.

Редактировать: ах, /proc/self/status ... узнавать что-то новое каждый день!

0 голосов
/ 18 сентября 2008

То, что вы ищете, может быть в переменных окружения. Вы должны быть осторожны с тем, какую оболочку вы используете при проверке переменных окружения. bash использует "UID", в то время как tcsh использует "uid" и в случае *nix имеет значение. Я также обнаружил, что tcsh устанавливает "gid", но я не смог найти подходящую переменную в bash.

...