¿Desde qué entorno está creando el proceso?
Si lo hace desde un entorno como el código C, puede bifurcar () y luego, en el elemento secundario, enviarse un SIGSTOP a usted mismo antes del exec (), evitando una mayor ejecución.
Una solución más genérica (probablemente la mejor) sería crear un trozo que lo haga. Entonces el programa stub:
- Tomar argumentos que consisten en el nombre y los argumentos del programa real
- enviar un SIGSTOP a sí mismo
- exec () el programa real con argumentos apropiados
Esto asegurará que evite cualquier tipo de condiciones de carrera que tengan que ver con que el nuevo procesamiento llegue demasiado lejos antes de que pueda enviarle una señal.
Un ejemplo para shell:
#!/bin/bash
kill -STOP $$
exec "$@"
Y usando el codez anterior:
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:~$
El jobs -l
muestra el PID. Pero si lo está haciendo desde un shell, no necesita el PID directamente. Simplemente puede hacer: kill -CONT %1
(suponiendo que solo tenga un trabajo).
¿Hacerlo con más de un trabajo? Dejado como ejercicio para el lector :)
#!/bin/bash
[enter]$@ &
[enter]PID=$!
[enter]kill -STOP $PID
[enter]echo "Suspended: $PID, press ENTER to continue it"
[enter]read
[enter]kill -CONT $PID
[enter]wait $PID
[enter]echo