У меня проблема с Башом, и я не знаю почему.
Под оболочкой я ввожу:
echo $$ ## print 2433
(echo $$) ## also print 2433
(./getpid) ## print 2602
«getpid» - это программа на C для получения текущего pid, например:
int main() { printf("%d", (int)getpid()); return 0; }
Что меня смущает, так это то, что:
- Я думаю, «(команда)» является подпроцессом (я прав?), И я думаю, что его pid должен отличаться от родительского pid, но они одинаковы, почему ...
- когда я использую свою программу, чтобы показать pid между круглыми скобками, pid, который он показывает, отличается, верно?
- '$$' - это что-то вроде макроса?
Вы можете помочь мне?
getpid
будет показан другой идентификатор процесса, даже если он не был запущен в подоболочке.echo $$ $BASHPID ; ( echo $$ $BASHPID )
демонстрирует это. Круглые скобки создают подоболочку. Операторы могут изменять значения переменных, и родительская оболочка не должна видеть эти изменения. Это реализовано какfork()
операция.Ответы:
$$
определяется для возврата идентификатора процесса родителя в подоболочке; со страницы руководства в разделе «Специальные параметры»:В
bash
4 вы можете получить идентификатор процесса ребенкаBASHPID
.источник
echo $$; (echo $$; (echo $$))
трижды повторяет один и тот же$ Expands to the process ID of the shell
это правда?echo $
просто повторяет буквальный $.$
один не расширение параметров. Страница man ссылается на имя специального параметра, который является$
; это не утверждение, что$
одно расширяется.echo $BASHPID
работает в bash 4 и 5 (но не в версии 3.2.57 для MacOS)Вы можете использовать один из следующих.
$!
это PID последнего фонового процесса.kill -0 $PID
проверяет, все ли еще работает.$$
это PID текущей оболочки.источник
kill -0 $!
если мы говорим о фоновых процессах?PID
по умолчанию ничего не установлено.$$
является псевдонимом в Bash для текущего PID скрипта . См. Различия между$$
и$BASHPID
здесь , и прямо над этой дополнительной переменной,$BASH_SUBSHELL
которая содержит уровень вложенности.источник
Попробуйте,
getppid()
если вы хотите, чтобы ваша C-программа печатала PID вашей оболочки.источник
Если бы вы спрашивали, как получить PID известной команды, она бы выглядела примерно так:
Если вы ввели команду ниже # Выдалась команда ***
Тогда вы бы использовали:
Здесь происходит передача всех необходимых уникальных символов в поле, и это поле можно отобразить с помощью
echo $ PIDs
источник
этот универсальный способ получить правильный пид
pid=$(cut -d' ' -f4 < /proc/self/stat)
такая же хорошая работа для саба
проверить вывод
источник