Что такое код getpid


Содержание

emscripten код для функций getpid и getppid

Моя цель — выяснить идентификаторы потоков и идентификаторы процессов в потоке и процесс, выполняющий мой код javascript. Я не мог найти никаких функций, которые могли бы дать мне это, поэтому я использую базовый код C, как указано ниже, и передаю его с помощью emscripten в JS-код. Код C выглядит так:

Код транслируется без ошибки, но я получаю тот же результат для javascript в любом браузере, который я запускаю, в результате я являюсь 8, а процесс 42 называется 1. Может кто-нибудь, пожалуйста, скажите мне, почему это происходит?

По крайней мере, в браузере нить и идентификатор процесса не подвергаются JavaScript, поэтому их невозможно восстановить. По-видимому, emscripten заполняет какую-то макетную реализацию, которая по сути просто «возвращает 42»; потому что 42 — хорошее число.

Это не вопрос языка программирования — исходные двоичные файлы (скомпилированные с C или других языков) могут получить доступ к таким внутренним системам, но все, что работает внутри браузера JavaScript VM, не может. Неважно, записываете ли вы код JavaScript вручную или компилируете его из C (или Dart или машинописного или любого другого).

Что такое символ ___mac_get_p >

Я профилирую некоторый многопроцессный код nodejs, работающий на OSX.

Что такое ___mac_get_pid ? Это название, безусловно, наводит на мысль, что это какой-то код, который «получает PID на Mac», но время кажется чрезмерным.

Поиск в Google ничего полезного не дал.

Решение

__mac_get_pid системный вызов позади mac_get_pid библиотечная функция. Это описано в справочной странице mac_get : http://man.cx/mac_get(3)

mac_get_pid .. получить метку файла, сокета, узла сокета или процесса
Системные вызовы mac_get_pid () и mac_get_proc () возвращают метку процесса, связанную с произвольным идентификатором процесса, или текущий процесс.

Хранилище меток для использования с этими вызовами должно быть сначала выделено и подготовлено с использованием функций mac_prepare (3). Когда приложение выполнено с использованием метки, память может быть возвращена с помощью mac_free (3).

«MAC» здесь не Mac OS X / macOS, но Posix.1e «s Обязательный контроль доступа («был введен в FreeBSD 5.0 ​​как часть TrustedBSD Проект «). mac_get_pid является реализовано в macOS / Dawrin / XNU как «Расширенные интерфейсы не POSIX.1e».

Возможно, в используемых библиотеках nodejs есть некоторые методы, которые пытаются выполнить детальную работу со списками процессов (например, ps / top), но они не смогли ограничить частоту своих запросов. Получение нескольких стековых трасс mac_get_pid либо с профилировщиком (нет V8 профилировщик какие только стеки JS , но какой-то внешний профилировщик подключен к процессу nodejs) или с помощью отладчика (gdb / lldb) путем ручной остановки и проверки обратной трассировки, пока вы не найдете, кто вызывает mac_get_pid (продолжить и остановить снова, когда вы не в mac_get_pid ) является необходимым шагом, чтобы выяснить, кто это называл.

_getpid _getpid

Получает идентификатор процесса. Gets the process identification.

Этот API нельзя использовать в приложениях, выполняемых в среде выполнения Windows. This API cannot be used in applications that execute in the Windows Runtime. Дополнительные сведения: Функции CRT, которые не поддерживаются в приложениях универсальной платформы Windows. For more information, see CRT functions not supported in Universal Windows Platform apps.

Синтаксис Syntax

Возвращаемое значение Return Value


Возвращает идентификатор процесса, полученный из системы. Returns the process ID obtained from the system. Ошибка не возвращается. There is no error return.

Примечания Remarks

Функция _getpid получает идентификатор процесса из системы. The _getpid function obtains the process ID from the system. Идентификатор процесса однозначно идентифицирует вызывающий процесс. The process ID uniquely identifies the calling process.

Требования Requirements

Дополнительные сведения о совместимости см. в разделе Совместимость. For more compatibility information, see Compatibility.

emscripten код GETPID и getppid функций

Моя цель, чтобы выяснить нить идентификаторы и идентификаторы процессов нити и процесс, запущенные мой яваскрипта кода. Я не мог найти функции, которые могли бы дать мне это так я использую базовый код C, как написано ниже и transpile его с помощью emscripten в код JS. Код С, как показано ниже: —

Код transpiles без ошибок , но я получаю тот же результат для JavaScript в любом браузере , я бегу, в результате чего я 8 и процесс 42 вызывается 1 . Может кто — нибудь пожалуйста , скажите мне , почему это происходит?

По крайней мере, в браузере, нити и идентификатор процесса не подвергаются JavaScript, так что нет никакого способа, чтобы получить их. Видимо emscripten заливок в какой-то притворной реализации, по существу, просто не «возвращение 42;» потому что 42 является хорошим числом.

Это не вопрос языка программирования — родной двоичные файлы (скомпилированные из C или других языках) могут получить доступ к таким системным внутренностей, но все работает внутри браузера JavaScript VM не может. Это не имеет значения , вы пишете ли код JavaScript вручную, или скомпилировать его из C (или Дарта или машинопись или любой другой ).

Что такое код getpid

100 просмотра

1 ответ

60 Репутация автора

Моя цель — узнать идентификаторы потоков и идентификаторы процессов, а также процесс, на котором выполняется мой код JavaScript. Я не смог найти функций, которые могли бы предоставить мне это, поэтому я использую базовый код C, как написано ниже, и переносу его с помощью emscripten в код JS. Код C показан ниже:

Код переносится без ошибок, но я получаю тот же результат для javascript в любом браузере, который я запускаю, в результате я — 8, а процесс 42 — 1 . Может кто-нибудь сказать, пожалуйста, почему это происходит?

Ответы (1)

1 плюс

8375 Репутация автора


По крайней мере, в браузере идентификатор потока и процесса не открыт для JavaScript, поэтому нет способа их получить. Очевидно, emscripten заполняет некоторую ложную реализацию, которая, по сути, просто «возвращает 42;» потому что 42 хороший номер.

Это не вопрос языка программирования — нативные двоичные файлы (скомпилированные из C или других языков) могут получить доступ к таким внутренним компонентам системы, но все, что работает внутри JavaScript виртуальной машины браузера, не может. Не имеет значения, пишете ли вы код JavaScript вручную или компилируете его из C (или Dart, Typescript или чего-то еще).

Процессы в операционной системе UNIX

Понятие процесса в UNIX. Его контекст

Все построение операционной системы UNIX основано на использовании концепции процессов, которая обсуждалась на лекции. Контекст процесса складывается из пользовательского контекста и контекста ядра , как изображено на рисунке 3-4.1.

Под пользовательским контекстом процесса понимают код и данные, расположенные в адресном пространстве процесса. Все данные подразделяются на:

  • инициализируемые неизменяемые данные (например, константы);
  • инициализируемые изменяемые данные (все переменные, начальные значения которых присваиваются на этапе компиляции);
  • неинициализируемые изменяемые данные (все статические переменные, которым не присвоены начальные значения на этапе компиляции);
  • стек пользователя;
  • данные, расположенные в динамически выделяемой памяти (например, с помощью стандартных библиотечных C функций malloc() , calloc() , realloc () ).

Исполняемый код и инициализируемые данные составляют содержимое файла программы, который исполняется в контексте процесса. Пользовательский стек применяется при работе процесса в пользовательском режиме (user-mode).

Под понятием «контекст ядра» объединяются системный контекст и регистровый контекст , рассмотренные на лекции. Мы будем выделять в контексте ядра стек ядра, который используется при работе процесса в режиме ядра ( kernel mode ), и данные ядра, хранящиеся в структурах, являющихся аналогом блока управления процессом — PCB . Состав данных ядра будет уточняться на последующих семинарах. На этом занятии нам достаточно знать, что в данные ядра входят: идентификатор пользователя — UID , групповой идентификатор пользователя — GID , идентификатор процесса — PID , идентификатор родительского процесса — PPID .

Идентификация процесса

Каждый процесс в операционной системе получает уникальный идентификационный номер – PID (process identificator) . При создании нового процесса операционная система пытается присвоить ему свободный номер больший, чем у процесса, созданного перед ним. Если таких свободных номеров не оказывается (например, мы достигли максимально возможного номера для процесса), то операционная система выбирает минимальный номер из всех свободных номеров. В операционной системе Linux присвоение идентификационных номеров процессов начинается с номера 0, который получает процесс kernel при старте операционной системы. Этот номер впоследствии не может быть присвоен никакому другому процессу. Максимально возможное значение для номера процесса в Linux на базе 32-разрядных процессоров Intel составляет 2 31 -1.

Состояния процесса. Краткая диаграмма состояний

Модель состояний процессов в операционной системе UNIX представляет собой детализацию модели состояний, принятой в лекционном курсе. Краткая диаграмма состояний процессов в операционной системе UNIX изображена на рисунке 3-4.2.


Как мы видим, состояние процесса исполнение расщепилось на два состояния: исполнение в режиме ядра и исполнение в режиме пользователя . В состоянии исполнение в режиме пользователя процесс выполняет прикладные инструкции пользователя . В состоянии исполнение в режиме ядра выполняются инструкции ядра операционной системы в контексте текущего процесса (например, при обработке системного вызова или прерывания). Из состояния исполнение в режиме пользователя процесс не может непосредственно перейти в состояния ожидание, готовность и закончил исполнение. Такие переходы возможны только через промежуточное состояние «исполняется в режиме ядра» . Также запрещен прямой переход из состояния готовность в состояние исполнение в режиме пользователя .

Приведенная выше диаграмма состояний процессов в UNIX не является полной. Она показывает только состояния, для понимания которых достаточно уже полученных знаний. Пожалуй, наиболее полную диаграмму состояний процессов в операционной системе UNIX можно найти в книге [ 1 ] (рисунок 6.1.).

Иерархия процессов

В операционной системе UNIX все процессы, кроме одного, создающегося при старте операционной системы, могут быть порождены только какими-либо другими процессами. В качестве прародителя всех остальных процессов в подобных UNIX системах могут выступать процессы с номерами 1 или 0 . В операционной системе Linux таким родоначальником, существующим только при загрузке системы, является процесс kernel с идентификатором 0 .

Таким образом, все процессы в UNIX связаны отношениями процесс-родитель – процесс-ребенок и образуют генеалогическое дерево процессов. Для сохранения целостности генеалогического дерева в ситуациях, когда процесс-родитель завершает свою работу до завершения выполнения процесса-ребенка, идентификатор родительского процесса в данных ядра процесса-ребенка (PPID – parent process identificator) изменяет свое значение на значение 1 , соответствующее идентификатору процесса init , время жизни которого определяет время функционирования операционной системы. Тем самым процесс init как бы усыновляет осиротевшие процессы. Наверное, логичнее было бы заменять PPID не на значение 1 , а на значение идентификатора ближайшего существующего процесса-прародителя умершего процесса-родителя, но в UNIX почему-то такая схема реализована не была.

Системные вызовы getpp >Данные ядра, находящиеся в контексте ядра процесса, не могут быть прочитаны процессом непосредственно. Для получения информации о них процесс должен совершить соответствующий системный вызов . Значение идентификатора текущего процесса может быть получено с помощью системного вызова getpid() , а значение идентификатора родительского процесса для текущего процесса – с помощью системного вызова getppid() . Прототипы этих системных вызовов и соответствующие типы данных описаны в системных файлах и . Системные вызовы не имеют параметров и возвращают идентификатор текущего процесса и идентификатор родительского процесса соответственно.

Системные вызовы getpid() и getppid()

9.1.2. Идентификация процесса: getpid() и getppid()

Похожие главы из других книг

Глава 9 Идентификация и аутентификация

Глава 9 Идентификация и аутентификация Независимо от того, какую систему защиты вы используете, чаще всего первым шагом работы является идентификация и подтверждение подлинности (аутентификация): кто вы такой и можете ли это доказать? Как только компьютер узнает вас, он

Единственность и идентификация

Единственность и идентификация Предыдущий раздел был посвящен запросам QueryInterface, которые представляют собой ответы типа «да/нет» вызывающим объектам. QueryInterface действительно возвращает S_OK (да) или E_NOINTERFACE (нет). Впрочем, когда QueryInterface возвращает S_OK, то он также возвращает

3 Абсолютная идентификация

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

Идентификация по ДНК

Идентификация по ДНК Дезоксирибонуклеиновая кислота, более известная под названием ДНК, – молекула, которая одновременно разделяет и объединяет нас. При помощи ДНК наследственные признаки передаются следующим поколениям, сходство ДНК характерно для семей и кланов,

Идентификация ДНК

Идентификация тела, а не человека

Идентификация тела, а не человека Абсолютная идентификация – соблазнительная идея. Но, к сожалению, эта идея изначально порочна. Все описанные в этой главе системы идентификации обладают одним существенным недостатком: они идентифицируют не личность, они


9.2.1 Идентификация конфигурации

13.3.1. Идентификация проблем сложности

13.3.1. Идентификация проблем сложности В каждом текстовом редакторе присутствует определенный уровень необходимой сложности. Как минимум, редактор должен поддерживать во внутреннем буфере копию файла или файлов, редактируемых пользователем в текущий момент.

13.3.1. Идентификация проблем сложности

13.3.1. Идентификация проблем сложности В каждом текстовом редакторе присутствует определенный уровень необходимой сложности. Как минимум, редактор должен поддерживать во внутреннем буфере копию файла или файлов, редактируемых пользователем в текущий момент.

Идентификация потоков

Идентификация потоков Функции, используемые для получения идентификаторов (ID) и дескрипторов потоков, напоминают те, которые используются для аналогичных целей в случае процессов. • GetCurrentThread — возвращает ненаследуемый псевдодескриптор вызывающего

5.18.1 Идентификация сети и подсети

5.18.1 Идентификация сети и подсети Для указания сети удобно использовать формат адреса с точками. По соглашению, это делается при заполнении локальной части адреса нулями. Например, 5.0.0.0 указывает на сеть класса А, 131.18.0.0 — на сеть класса В, а 201.49.16.0 — на сеть класса

Идентификация и аутентификация

Идентификация и аутентификация Идентификацией субъекта называется процесс сопоставления введенной им своей характеристики с некоторым идентификатором, хранимым системой. В дальнейшем идентификатор субъекта используется для предоставления субъекту определенного

Идентификация сервера Samba

Идентификация сервера Samba В сетях NetBIOS используется система имен, не связанная с доменными именами, применяемыми в сетях TCP/IP. Например, компьютеру harding.threeroomco.com может соответствовать имя BILLY, принадлежащее домену USPRES. Для того чтобы удобнее было отличать имена TCP/IP от имен

Идентификация объекта для использования

Идентификация объекта для использования Вы должны сообщить VBA, какой именно объект нужен. Для этого используется объектное выражение- VBA-выражение специального вида, которым однозначно определяется конкретный объект для использования. То остающееся за кулисами

Идентификация посетителей

Идентификация посетителей Один и тот же пользователь может просматривать достаточно большое число страниц, запрашивать на сервере множество разных файлов, поэтому первая задача статистики – определение принадлежности различных запросов одному пользователю, или,

17.2. Идентификация членов иерархии

17.2. Идентификация членов иерархии В разделе 2.4 мы уже упоминали о том, что в объектном проектировании обычно есть один разработчик, который конструирует и реализует класс, и много пользователей, применяющих предоставленный открытый интерфейс. Это разделение


Fork() вместо getp >25.12.2014, 19:14. Просмотров 646. Ответов 1

Подпрограмма Routine Обязательный заголовок Required header
_getpid _getpid 25.12.2014, 19:14

Fork() процессы
Здравствуйте, Помогите please объяснить программу, что она выполняет (Linux) main() < int.

Fork() возвращает -1
Есть модуль, которая слущает UDP порт на наличие данных, когда приходят данные, вызывается функция.

Fork,waitpid
Имеется программа написанная на Си,которая выполняет рекурсивный поиск файлов в каталогах и.

Popen не вызывает fork
Столкнулся с проблемой.В программе с помощью popen вызываю другую программу в качестве дочернего.

Нюансы работы fork()
Всем привет. Вопрос такой. Есть программа, которая записывает себе в статические переменные.

26.12.2014, 06:19 2

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

26.12.2014, 06:19

Переделать задачу с потоками на fork
Нужно скопировать файл, использую параллельное программирование. Есть реализация этой задачи с.

Особенности использования fork и exec
Подскажите пожалуйста, если мы используем в программе вызов fork, а потом exec, или просто сразу.

Что такое процедура работы getpid в glibc?

Я пытаюсь сделать project, который взламывает ядро ​​в github. Версия ядра — linux-3.18.6.

QEMU используется для имитации окружающей среды.

В моем приложении я пытаюсь понять процедуру syscall, следуя им. Путь к моей цели — это как программа оболочки. Я просто создаю несколько команд для запуска относительного syscall. Возможно, это просто через картину. some commands

код прост следующим образом:

1 Используйте API GETPID.

2 Используйте int $ 0x80 напрямую.

Потому что мое приложение просто запустить в процессе с PID 1, поэтому каждый раз, когда я набираю команду GETPID, она возвращает 1. Конечно, это правда.


Странно то, что когда я использую gdb для отладки процесса syscall, он останавливается в berakpoint sys_getpid только один раз, когда я набираю getpid для выполнения. Когда я делаю это снова и снова, он просто выходит без остановки.

Очевидно, что использование int $ 0x80 абсолютно верно, как я понимаю.

Чтобы устранить проблему, я сделал некоторые исследования. Загрузите код glibc-источника (glibc-2.25), чтобы увидеть, как api getpid обертывает int $ 0x80. К сожалению, его там не было, или я просто не нашел правильной позиции.

некоторый код в glibc.

Если у меня есть неправильный код, сообщите мне, tks.

Как указывает код, определение getpid не содержится в glibc. После чтения некоторых данных кто-то сказал the VDSO. .

Обратите внимание, что, AFAIK, значительная часть стоимости простых системных вызовов происходит из пользовательского пространства ядра и обратно. Следовательно, для некоторых системных вызовов (возможно, gettimeofday, getpid . ) VDSO может избежать даже этого (и технически может избежать реального сценария).

В мужчине GETPID pgae:

C различия библиотека/ядро ​​ С GLibC версии 2.3.4, функция Glibc обертка для GETPID() кэширует PIDs, с тем чтобы избежать дополнительных системных вызовов когда процесс неоднократно вызывает getpid().Обычно это кэширование является невидимым, но его правильная работа основана на поддержке функций обертки для fork (2), vfork (2) и клона (2): если приложение обходит оболочки glibc для этих системных вызовов, используя syscall (2), то вызов getpid() в ребёнке вернет неправильное значение (точнее: он вернет PID родительского процесса). См. Также clone (2) for dis- cussion case, в котором getpid() может возвращать неправильное значение, даже если , вызывающий клон (2) через функцию обертки glibc.

Несмотря на то, что вышли так много объяснений, я не могу понять процедуру работы API getpid.

В качестве контраста время API легко понять. Определение времени:

Наконец, она встроена ASM, нормальный способ использования исходного кода ядра.

Может ли кто-нибудь объяснить, как работает API getpid? Почему getpid просто попадает в syscall sys_getpid только один раз? Некоторые ссылки восхищаются, если это возможно.

Благодарим за помощь.

Создан 06 апр. 17 2020-04-06 08:25:12 a-thorn

Что такое код getpid

100 просмотра

1 ответ

60 Репутация автора

Моя цель — узнать идентификаторы потоков и идентификаторы процессов, а также процесс, на котором выполняется мой код JavaScript. Я не смог найти функций, которые могли бы предоставить мне это, поэтому я использую базовый код C, как написано ниже, и переносу его с помощью emscripten в код JS. Код C показан ниже:

Код переносится без ошибок, но я получаю тот же результат для javascript в любом браузере, который я запускаю, в результате я — 8, а процесс 42 — 1 . Может кто-нибудь сказать, пожалуйста, почему это происходит?

Ответы (1)

1 плюс

8375 Репутация автора

По крайней мере, в браузере идентификатор потока и процесса не открыт для JavaScript, поэтому нет способа их получить. Очевидно, emscripten заполняет некоторую ложную реализацию, которая, по сути, просто «возвращает 42;» потому что 42 хороший номер.

Это не вопрос языка программирования — нативные двоичные файлы (скомпилированные из C или других языков) могут получить доступ к таким внутренним компонентам системы, но все, что работает внутри JavaScript виртуальной машины браузера, не может. Не имеет значения, пишете ли вы код JavaScript вручную или компилируете его из C (или Dart, Typescript или чего-то еще).

Илон Маск рекомендует:  Курс по вёрстке
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL