Для якого процесу "/ proc / self /`? "


40

https://www.centos.org/docs/5/html/5.2/Deployment_Guide/s3-proc-self.html говорить

/proc/self/Каталог являє собою посилання на поточний процес.

Завжди є кілька процесів, що працюють одночасно, тож який процес є "поточним запущеним процесом"?

Чи має "поточний запущений процес" щось спільне з тим, який процес зараз працює на процесорі, враховуючи переключення контексту?

Чи "поточно запущений процес" не має нічого спільного з процесами переднього плану та фоновими процесами?


15
Процес, який оцінює /proc/self, звичайно.
Чарльз Даффі

8
До якої людини я і я звертаюся?
Jeffrey Bosboom

Відповіді:


64

Це не має нічого спільного з процесами переднього плану та фонових процесів; це стосується лише поточного запущеного процесу. Коли ядро ​​має відповісти на запитання "На що /proc/selfвказує?", Воно просто вибирає запланований на даний момент pid , тобто процес, що працює в даний час (у поточному логічному процесорі). Ефект полягає в тому, що /proc/selfзавжди вказується на запитувальну програму; якщо ти біжиш

ls -l /proc/self

ви побачите lspid, якщо ви пишете код, який використовує /proc/selfцей код, побачить свій pid тощо.


13
Це сенс "точний", але не має сенсу для того, хто не розуміє поняття ядра "поточного". Кращою відповіддю буде те, що це процес здійснення системного виклику з /proc/selfчастиною назви шляху в одному з його аргументів.
Р ..

1
@R .. ось що підкреслює відповідь ilkkachu , не соромтеся підкріпити це - я це зробив.
Стівен Кітт

36

Той, що здійснює доступ до символьної посилання (викликає readlink () на ній або відкриває () на шляху через неї). Він би працював на процесорі в той час, але це не актуально. Багатопроцесорна система може мати декілька процесів на процесорі одночасно.

Процеси переднього плану та фонового зображення - це переважно конструкції оболонки, і немає жодного унікального процесу переднього плану, оскільки всі сеанси оболонки в системі будуть мати один.


27

Формулювання могло б бути кращим, але знову ж таки будь-яке формулювання, яке ви намагаєтеся скласти, щоб висловити ідею самонавіювання, стане заплутаним. Ім'я каталогу на мою думку є більш описовим.

В основному, /proc/self/представляє процес читання /proc/self/. Отже, якщо ви намагаєтесь відкрити /proc/self/програму на C, то вона представляє цю програму. Якщо ви намагаєтеся зробити це з оболонки, то це оболонка і т.д.

Але що робити, якщо у вас є чотирьохядерний процесор, здатний одночасно виконувати 4 процеси, для реального, а не багатозадачного?

Тоді кожен процес буде бачити інший /proc/self/справжній, не маючи змоги побачити один одного /proc/self/.

Як це працює?

Ну, /proc/self/насправді не папка. Це драйвер пристрою, який, можливо, відкриває себе як папку, якщо спробувати отримати доступ до нього. Це тому, що він реалізує необхідний для папок API. /proc/self/Каталог не єдине , що робить це. Розгляньте загальнодоступні папки, встановлені з віддалених серверів або на монтажі USB-мініатюр або папки. Всі вони працюють, застосовуючи один і той же набір API, які змушують їх вести себе як папки.

Коли процес намагається отримати доступ /proc/self/до драйвера пристрою, він буде динамічно генерувати його вміст, читаючи дані цього процесу. Тож файлів у /proc/self/насправді не існує. Це як би дзеркало, яке віддзеркалює процес, який намагається подивитися на нього.

Це дійсно драйвер пристрою? Вам здається, що ви надто спрощуєте речі!

Так, це насправді так. Якщо ви хочете бути педантичним, це модуль ядра. Але якщо ви перевіряєте публікації Usenet на різних каналах розробників Linux, більшість розробників ядра взаємозамінно використовують "драйвер пристрою" та "модуль ядра". Я писав драйвери пристроїв, помилки ... модулі ядра, для Linux. Якщо ви хочете написати свій власний інтерфейс /proc/, скажімо, наприклад, що ви хочете, щоб /proc/unix.stackexchange/файлова система, яка повертає публікації з цього веб-сайту, ви можете прочитати про те, як це зробити у поважній книзі "Драйвери Linux", виданій O'Reilly. Він навіть доступний як м'яка копія в Інтернеті.


6
/proc/selfне є драйвером пристрою, а натомість є частиною файлової системи, яка знаходиться під впливом ядра procfs.
Кріс Даун

1
@ChrisDown: Так, але він реалізований як модуль ядра - що є версією драйвера пристрою для Linux - /procу поважній книзі "Драйвери Linux" є навіть приклад реалізації базованого драйвера. Я повинен знати, я реалізував один у коледжі. Я, напевно, міг би використати термін "модуль ядра", але "драйвер пристрою" - це те, що знайоме більшості людей, і я не хочу створювати оманливе враження, що існує значна різниця між "модулем ядра" та "драйвером пристрою" крім термінології.
slebetman

7
@slebetman добре, procfs не є модулем сам по собі, він може бути вбудований, ніколи не будуватися як модуль. Якщо ви хочете розділити волоски, волосся потрібно розділити, це те, що це драйвер файлової системи, а не драйвер пристрою
варить

10

Незалежно від того, до якого процесу трапляється доступ /proc/selfдо файлів / папок у них.

Спробуйте cat /proc/self/cmdline. Ви отримаєте, здивований сюрприз, cat /proc/self/cmdline(насправді замість пробілу між нульовим tта « проміжком» буде нульовий символ /), оскільки це буде процес кота, який отримує доступ до цього псевдофайлу.

Коли ви це зробите ls -l /proc/self, ви побачите підпис самого процесу ls. Або як щодо ls -l /proc/self/exe; вона вкаже на виконуваний файл ls.

Або спробуйте це для зміни:

$ cp /proc/self/cmdline /tmp/cmd
$ hexdump -C /tmp/cmd
00000000  63 70 00 2f 70 72 6f 63  2f 73 65 6c 66 2f 63 6d  |cp./proc/self/cm|
00000010  64 6c 69 6e 65 00 2f 74  6d 70 2f 63 6d 64 00     |dline./tmp/cmd.|
0000001f

або навіть

$ hexdump -C /proc/self/cmdline 
00000000  68 65 78 64 75 6d 70 00  2d 43 00 2f 70 72 6f 63  |hexdump.-C./proc|
00000010  2f 73 65 6c 66 2f 63 6d  64 6c 69 6e 65 00        |/self/cmdline.|
0000001e

Як я вже говорив, це залежно від того, до якого процесу трапляється доступ /proc/selfабо файли / папки в них.


2

/ proc / self - синтаксичний цукор. Це ярлик до контактуючих / proc / та результату системного виклику getpid () (доступний у bash як метаваріабельний $$). У випадку з сценарієм оболонки це може заплутатися, оскільки багато висловлювань посилаються на інші процеси, укомплектовані власними PID-кодами ... PID-адреси, які частіше за все посилаються на мертві процеси. Поміркуйте:

root@vps01:~# ls -l /proc/self/fd
total 0
lrwx------ 1 root root 64 Jan  1 01:51 0 -> /dev/pts/0
lrwx------ 1 root root 64 Jan  1 01:51 1 -> /dev/pts/0
lrwx------ 1 root root 64 Jan  1 01:51 2 -> /dev/pts/0
lr-x------ 1 root root 64 Jan  1 01:51 3 -> /proc/26562/fd
root@vps01:~# echo $$
593

'/ bin / ls' оцінить шлях до каталогу, вирішивши його як / proc / 26563, оскільки це PID процесу - новостворений / bin / ls процес - який читає вміст каталогу. Але до моменту наступного процесу в конвеєрі, у випадку сценаріїв оболонки, або до моменту повернення підказки, у випадку інтерактивної оболонки шлях більше не існує, а вихідна інформація відноситься до неіснуючого процесу.

Однак це стосується лише зовнішніх команд (тих, що є фактично виконаними програмними файлами, на відміну від вбудованої в саму оболонку). Отже, ви отримаєте різні результати, якщо, скажімо, використовуєте глобальну назву файлів для отримання списку вмісту каталогу, а не для передачі імені шляху до зовнішнього процесу / bin / ls:

root@vps01:~# ls /proc/self/fd
0  1  2  3
root@vps01:~/specs# echo /proc/self/fd/*
/proc/self/fd/0 /proc/self/fd/1 /proc/self/fd/2 /proc/self/fd/255 /proc/self/fd/3

У першому рядку оболонка породила новий процес, '/ bin / ls', через системний виклик exec (), передаючи "/ proc / self / fd" як argv [1]. '/ bin / ls', у свою чергу, відкрив каталог / proc / self / fd і прочитав, а потім надрукував його вміст, як він повторив над ними.

Однак другий рядок використовує глобул () за лаштунками для розширення списку імен файлів; вони передаються у вигляді масиву рядків для відлуння. (Зазвичай реалізується як внутрішня команда, але часто також є / bin / echo бінарний ... але ця частина насправді не має значення, оскільки echo має справу лише з рядками, вона ніколи не подається до жодного syscall, пов'язаного з іменами шляху.)

Тепер розглянемо такий випадок:

root@vps01:~# cd /proc/self/fd
root@vps01:~# ls
0  1  2  255

Тут оболонка, батьківський процес / bin / ls, зробила підкаталог / proc / self свого поточного каталогу . Таким чином, відносні імена оцінюються з його точки зору. Я найкраще здогадуюсь, що це пов’язано з семантикою файлів POSIX, де ви можете створити кілька жорстких посилань на файл, включаючи будь-які відкриті дескриптори файлів. Тож цього разу / bin / ls поводиться аналогічно echo / proc / $$ / fd / *.


-2

Оскільки оболонка викликає такі програми, як ls, в окремих процесах, / proc / self відображатиметься як символьне посилання на nnnnn , де nnnnn - ідентифікатор процесу ls-процесу. Наскільки я знаю, часто використовувані оболонки не мають вбудованого для читання символьних посилань, але Perl має:

perl -e 'print' / proc / self link: ", readlink (" / proc / self ")," - pid $$ \ n "; '

Отже, / proc / self веде себе як посилання, але файлова система procfs робить його "магічним" процесом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.