Подтвердить что ты не робот

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

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

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

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

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

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

  • Я думаю, что "(команда)" является подпроцессом (я прав?), и я думаю, что его pid должен отличаться от родительского pid, но они одинаковы, почему...
  • Когда я использую свою программу для отображения pid между скобками, pid, который он показывает, отличается, правильно?
  • "$$" что-то вроде макроса?

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

  • $! - это PID последнего обработанного процесса.
  • kill -0 $PID проверяет, продолжает ли он работать.
  • $$ - это PID текущей оболочки.

Ответ 3

  • Скобки ссылаются на подоболочку в Bash. Поскольку это только подоболочка, она может иметь один и тот же PID - зависит от реализации.
  • Программа C, которую вы вызываете, представляет собой отдельный процесс, который имеет свой собственный уникальный PID - не имеет значения, находится ли он в подоболочке или нет.
  • $$ - это псевдоним в Bash to текущий script PID. См. различия между $$ и $BASHPID здесь, а справа выше - дополнительная переменная $BASH_SUBSHELL, которая содержит уровень вложенности.

Ответ 4

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

Ответ 5

Если бы вы спрашивали, как получить PID известной команды, она бы выглядела примерно так:

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

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


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

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

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

echo $ PIDs

Ответ 6

этот универсальный способ получить правильный pid

pid=$(cut -d' ' -f4 < /proc/self/stat)

такая же хорошая работа для саба

SUB(){
    pid=$(cut -d' ' -f4 < /proc/self/stat)
    echo "$$ != $pid"
}

echo "pid = $$"

(SUB)

проверить вывод

pid = 8099
8099 != 8100