получить pid в оболочке (bash)


у меня проблема с Bash, и я не знаю, почему.
Под оболочкой я ввожу:

echo $$    ## print 2433
(echo $$)  ## also print 2433
(./getpid) ## print 2602

"getpid" - это программа C для получения текущего pid, например:

   int main() {
    printf("%d", (int)getpid());
    return 0;
   }

меня смущает вот что:

  1. я думаю, что "(команда) " является подпроцессом (я прав?), и я думаю, что его pid должен отличаться от своего родительского pid, но они одинаковы, почему...
  2. когда я использую свою программу, чтобы показать pid между скобками, pid это шоу-это другое, не так ли?
  3. это '$$' что-то вроде макроса?

вы можете мне помочь?

5 101

5 ответов:

$$ определяется для возврата идентификатора процесса родителя в подобласти; из справочной страницы в разделе "Специальные параметры":

$ расширяется до идентификатора процесса оболочки. В подрешетке a () он расширяется до идентификатора процесса текущей оболочки, а не подрешетки.

на bash 4, Вы можете получить идентификатор процесса ребенка с BASHPID.

~ $ echo $$
17601
~ $ ( echo $$; echo $BASHPID )
17601
17634

вы можете использовать один из следующих.

  • $! является PID последнего фонового процесса.
  • kill -0 $PID проверяет, работает ли он по-прежнему.
  • $$ - это PID текущей оболочки.
  1. скобки вызова subshell в Баш. Так как это только подобласть, она может иметь тот же PID - зависит от реализации.
  2. программа C, которую вы вызываете, является отдельным процессом, который имеет свой собственный уникальный PID - не имеет значения, находится ли он в подрешетке или нет.
  3. $$ - это псевдоним в Bash to текущий скрипт PID. Смотрите различия между $$ и $BASHPID здесь, а прямо над этим дополнительные переменная $BASH_SUBSHELL который содержит уровень вложенности.

попробовать getppid() Если вы хотите, чтобы ваша программа C печатала PID вашей оболочки.

если бы вы спрашивали, Как получить PID известной команды, это было бы похоже на что-то вроде этого:

Если вы дали команду ниже #Команда была выдана***

dd if=/dev/diskx of=/dev / disky


тогда вы бы использовали:

PIDs=$(ps | grep dd | grep if | cut -b 1-5)

что происходит здесь, это передает все необходимые уникальные символы в поле, и это поле можно повторить с помощью

echo $PIDs