Из какой среды вы создаете процесс?
Если вы делаете это из среды, такой как код на 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