Получить 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, который он показывает, отличается, правильно?
- "$$" что-то вроде макроса?
Вы можете мне помочь?
Ответы
Ответ 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