получить pid в оболочке (bash)
у меня проблема с Bash, и я не знаю, почему.
Под оболочкой я ввожу:
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 это шоу-это другое, не так ли?
- это '$$' что-то вроде макроса?
вы можете мне помочь?
5 ответов:
$$определяется для возврата идентификатора процесса родителя в подобласти; из справочной страницы в разделе "Специальные параметры":$ расширяется до идентификатора процесса оболочки. В подрешетке a () он расширяется до идентификатора процесса текущей оболочки, а не подрешетки.
на
bash4, Вы можете получить идентификатор процесса ребенка сBASHPID.~ $ echo $$ 17601 ~ $ ( echo $$; echo $BASHPID ) 17601 17634
вы можете использовать один из следующих.
$!является PID последнего фонового процесса.kill -0 $PIDпроверяет, работает ли он по-прежнему.$$- это PID текущей оболочки.
- скобки вызова subshell в Баш. Так как это только подобласть, она может иметь тот же PID - зависит от реализации.
- программа C, которую вы вызываете, является отдельным процессом, который имеет свой собственный уникальный PID - не имеет значения, находится ли он в подрешетке или нет.
$$- это псевдоним в Bash to текущий скрипт PID. Смотрите различия между$$и$BASHPIDздесь, а прямо над этим дополнительные переменная$BASH_SUBSHELLкоторый содержит уровень вложенности.
если бы вы спрашивали, Как получить PID известной команды, это было бы похоже на что-то вроде этого:
Если вы дали команду ниже #Команда была выдана***
dd if=/dev/diskx of=/dev / disky
тогда вы бы использовали:
PIDs=$(ps | grep dd | grep if | cut -b 1-5)что происходит здесь, это передает все необходимые уникальные символы в поле, и это поле можно повторить с помощью
echo $PIDs