Если у Вас есть установленный xdotool, то
xdotool selectwindow getwindowpid
сопровождаемый путем нажатия на рассматриваемое окно возвратит PID.
(Существуют другие способы выбрать рассматриваемое окно, например, если у Вас есть его окно ID, можно просто сделать xdotool getwindowpid
. Можно также выбрать по имени или класс, и т.д.),
Я действительно думаю, что это требует некоторых играющих по правилам от имени WM. Я не экспериментировал очень, или должен был.
Да. Разветвление записано &
:
echo child & echo parent
То, что может смущать Вас, является этим $$
не PID процесса оболочки, это - PID исходного процесса оболочки. Точка создания его этот путь является этим $$
уникальный идентификатор для конкретного экземпляра сценария оболочки: это не изменяется во время выполнения сценария, и это отличается от $$
в любом другом одновременно запускающем скрипте. Один способ получить фактический PID процесса оболочки sh -c 'echo $PPID'
.
Поток управления в оболочке не является тем же как C. Если в C Вы записали бы
first(); fork(); second(); third();
затем эквивалентная оболочка
after_fork () { second; third; }
first; after_fork & after_fork
Простая форма оболочки first; child & parent
соответствует обычной идиоме C
first(); if (fork()) parent(); else child();
&
и $$
существуйте и ведите себя этот путь в каждой оболочке стиля Границы и в (t) csh. $PPID
не существовал в orignal Оболочке Bourne, но находится в POSIX (таким образом, это находится в пепле, ударе, ksh, zsh, …).
Да, это назвало подоболочки. Код Shell в круглой скобке выполняется как подоболочка (ветвление). Однако первая оболочка обычно ожидает ребенка для завершения. Можно сделать это асинхронным использованием &
разделитель. Посмотрите его в в действии с чем-то вроде этого:
#!/bin/bash
(sleep 2; echo "subsh 1")&
echo "topsh"
$ колотят subsh.sh
&
одно только ветвление. Если Вы хотите выполнить больше чем один конвейер в дочернем процессе, достаточно использовать фигурные скобки (которые выполняют группировку, не создавая дочерний процесс): { sleep 2; echo child; } &
– Gilles 'SO- stop being evil'
18.02.2011, 10:31
Нет никакого собственного удара (или, к моему знанию, любой другой типичный *отклоняет оболочку), способ сделать это. Существует много способов породить разветвленные процессы, которые делают что-то еще асинхронно, но я не думаю, что существует что-либо, что следует за точной семантикой ветвления () системный вызов.
Типичный подход должен был бы иметь Вашу икру сценария верхнего уровня от помощников, которые делают просто работу, Вы хотите разделение. Если Вы делаете $0 $@ &
или что бы то ни было, Вы запустите вначале снова и должны понять это так или иначе.
Я на самом деле начинаю думать о нескольких умных путях, которыми мог бы сделать просто это....
Но, прежде чем мой мозг также увлекается этим, я думаю, что довольно хорошее правило: при попытке записать что-то в оболочке, и это становится полным умных приемов, и Вы желаете для большего количества функций языка, время переключиться на реальный язык программирования.
&
ветвление, нет никакого вовлеченного должностного лица. Fork+exec - при запуске внешней команды. – Gilles 'SO- stop being evil' 18.02.2011, 02:47exec
, но эти два языка действительно имеют другой поток управления. – Gilles 'SO- stop being evil' 18.02.2011, 02:55&
запускает подоболочку, в которой выполняется данная команда. Ветвление + должностное лицо. Вы не можете просто поместить&
без предыдущей команды для выполнения. – mattdm 18.02.2011, 02:58&
на строке отдельно. Но Вы не можете. Это не означает "ветвление здесь". Это означает, "выполняют предыдущую команду в фоновом режиме в подоболочке". – mattdm 18.02.2011, 03:36