Aus welcher Umgebung erstellen Sie den Prozess?
Wenn Sie dies in einer Umgebung wie C-Code tun, können Sie fork () ausführen und anschließend im untergeordneten Element ein SIGSTOP vor exec () an sich selbst senden, um die weitere Ausführung zu verhindern.
Eine allgemeinere Lösung (wahrscheinlich die beste) wäre, einen Stub zu erstellen, der dies tut. Das Stub-Programm würde also:
- Nehmen Sie Argumente, die aus dem Namen und den Argumenten des realen Programms bestehen
- Sende einen SIGSTOP an sich selbst
- exec () das echte Programm mit entsprechenden Argumenten
Dies stellt sicher, dass Sie vermeiden, dass Rennbedingungen, die mit der neuen Verarbeitung zusammenhängen, zu weit gehen, bevor Sie ein Signal an sie senden können.
Ein Beispiel für die Shell:
#!/bin/bash
kill -STOP $$
exec "$@"
Und obige Codez verwenden:
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:~$
Das jobs -l
zeigt die PID. Wenn Sie dies jedoch aus einer Shell heraus tun, benötigen Sie die PID nicht direkt. Sie können einfach Folgendes tun: kill -CONT %1
(vorausgesetzt, Sie haben nur einen Job).
Machst du es mit mehr als einem Job? Links als Übung für den Leser :)
#!/bin/bash
[enter]$@ &
[enter]PID=$!
[enterkill -STOP $PID
]echo "Suspended: $PID, press ENTER to continue it"
[enter]read
[enter]kill -CONT $PID
[enter]wait $PID
[enter]echo