Из какой среды вы создаете процесс?
Если вы делаете это из среды, такой как код на C, вы можете выполнить fork (), а затем в дочерней среде отправить SIGSTOP себе перед exec (), предотвращая дальнейшее выполнение.
Более общим решением (вероятно, лучшим) будет создание заглушки, которая делает это. Таким образом, программа-заглушка будет:
- Возьмите аргументы, состоящие из реального имени программы и аргументов
- отправь SIGSTOP себе
- exec () реальная программа с соответствующими аргументами
Это гарантирует, что вы избежите каких-либо условий гонки, связанных с тем, что новая обработка заходит слишком далеко, прежде чем вы сможете отправить ей сигнал.
Пример для оболочки:
#!/bin/bash
kill -STOP $$
exec "$@"
И используя вышеуказанный кодез:
michael@challenger:~$ ./stopcall.sh ls -al stopcall.sh
[1]+ Stopped ./stopcall.sh ls -al stopcall.sh
michael@challenger:~$ jobs -l
[1]+ 23143 Stopped (signal) ./stopcall.sh ls -al stopcall.sh
michael@challenger:~$ kill -CONT 23143; sleep 1
-rwxr-xr-x 1 michael users 36 2011-07-24 22:48 stopcall.sh
[1]+ Done ./stopcall.sh ls -al stopcall.sh
michael@challenger:~$
jobs -lПоказывает PID. Но если вы делаете это из оболочки, вам не нужен PID напрямую. Вы можете просто сделать: kill -CONT %1(при условии, что у вас есть только одна работа).
Делать это с более чем одной работой? Оставлено как упражнение для читателя :)
#!/bin/bash[введите]$@ &[введите]PID=$![введите]kill -STOP $PID[введите]echo "Suspended: $PID, press ENTER to continue it"[введите]read[введите]kill -CONT $PID[введите]wait $PID[введите]echo