Em qual ambiente você está criando o processo?
Se você estiver fazendo isso em um ambiente como o código C, poderá bifurcar () e, em seguida, no filho, enviar um SIGSTOP para si mesmo antes do exec (), impedindo a execução adicional.
Uma solução mais genérica (provavelmente a melhor) seria criar um esboço que faça isso. Portanto, o programa stub:
- Aceitar argumentos que consistem no nome e argumentos do programa real
- envie um SIGSTOP para si mesmo
- exec () o programa real com argumentos apropriados
Isso garantirá que você evite qualquer tipo de condição de corrida relacionada ao novo processamento, indo muito longe antes que você possa enviar um sinal para ele.
Um exemplo para shell:
#!/bin/bash
kill -STOP $$
exec "$@"
E usando codez acima:
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:~$
O jobs -l
mostra o PID. Mas se você estiver fazendo isso a partir de um shell, não precisará do PID diretamente. Você pode apenas fazer: kill -CONT %1
(supondo que você tenha apenas um emprego).
Fazendo isso com mais de um trabalho? Deixado como um exercício para o leitor :)
#!/bin/bash
[entrar]$@ &
[entrar]PID=$!
[entrar]kill -STOP $PID
[entrar]echo "Suspended: $PID, press ENTER to continue it"
[entrar]read
[entrar]kill -CONT $PID
[entrar]wait $PID
[entrar]echo