ratte13
Anmeldungsdatum: 15. August 2009
Beiträge: 240
|
Hallo, welches Signal erhält ein Programm, das im Terminal als Hintergrundprozess gestartet wurde, wenn man darauffolgend ein "exit" eingibt?
Ich habe durch folgendes Programm versucht, das herauszufinden:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 | #include <stdio.h>
#include <signal.h>
#include <stdlib.h>
static void handler(int signal) {
printf("Signal %i gefangen!",signal);
FILE* f = fopen("output.txt","w");
char* text = malloc(100);
sprintf(text,"Signal %i gefangen!",signal);
fwrite(text,100,1,f);
fclose(f);
free(text);
exit(EXIT_SUCCESS);
}
int main(int argc, char** argv) {
struct sigaction sa;
sigset_t ss;
sigemptyset(&ss);
sa.sa_handler = &handler;
sa.sa_mask = ss;
sa.sa_flags = SA_RESTART;
for(int i=0;i<50;i++) {
sigaction(i,&sa,NULL);
}
while(1) {
}
exit(EXIT_SUCCESS);
}
|
Allerdings wird keine Datei angelegt. Dies legt die Vermutung nahe, dass der Prozess gar kein Signal erhält.
Stimmt das?
Dem entgegen steht die Beobachtung, dass ein bestimmtes Programm, gestartet im Terminal, nicht startet wenn man "programmname & exit" eingibt. Vielen Dank ☺.
|
chilidude
Anmeldungsdatum: 18. Februar 2010
Beiträge: 867
|
Das wird dein Programm so nicht mehr auswerten können, schliesslich wird es sofort mit beendet. man 7 signal
|
ratte13
(Themenstarter)
Anmeldungsdatum: 15. August 2009
Beiträge: 240
|
Naja, wenn der Prozess bei einem "exit" ein Signal erhält, das er nicht abfangen kann, dann können das andere Prozesse auch nciht. Dies ist aber nicht so, weil andere Programm sich schon durch "Programmname & exit" starten lassen. Es muss sich also eigentlich um ein Signal handeln, das abgefangen werden kann. Zudem lief der Prozess noch.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12832
|
ratte13 schrieb: Naja, wenn der Prozess bei einem "exit" ein Signal erhält, das er nicht abfangen kann, dann können das andere Prozesse auch nciht. Dies ist aber nicht so, weil andere Programm sich schon durch "Programmname & exit" starten lassen. Es muss sich also eigentlich um ein Signal handeln, das abgefangen werden kann.
Der exit selber sendet kein Signal. Ich hätte eher gedacht, es gibt ein SIGHUP vom verschwindenden Terminal, wenn die letzte Shell terminiert. Aber scheinbar nicht. Ich habe es mit diesem Skript ausprobiert: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | #!/bin/bash
rm sig
# set -x
for s in {1..8} {10..64}; do
trap "echo '$s' >>sig; exit 0" $s
done
trap 'echo "PID $$" >>sig' 0
set +x
while :; do
:
done
|
Ausgeführt im ersten Terminal: (Der nice dient nur dazu, mit der Endlosschleife genug CPU zu lassen.) Dann exit , neues Terminal aufgemacht: $ cat sig
cat: sig: No such file or directory
$ kill 5565
$ cat sig
15
PID 5565 Der Prozess lebte also noch und hatte auch kein Signal bekommen. Erst mit dem kill wurde SIGTERM (#15) geschickt. Ciao robert
|
ratte13
(Themenstarter)
Anmeldungsdatum: 15. August 2009
Beiträge: 240
|
Wie aber kann es dann sein, dass das Programm einmal startet und einmal nicht?
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12832
|
ratte13 schrieb: Wie aber kann es dann sein, dass das Programm einmal startet und einmal nicht?
Wie meinen? Du hast doch danach gefragt, warum ein Programm bei exit der Shell terminiert. Was hat das jetzt wieder mit dem Starten zu tun?
|
ratte13
(Themenstarter)
Anmeldungsdatum: 15. August 2009
Beiträge: 240
|
Ja, das ist ja quasi die selbe Frage 😉. Ich starte ein Programm mit "Programmname & exit", dann erscheint der Splash-Screen und es passiert nichts weiter.
Ist das Programm bereits gestartet, so terminiert es allerdings nicht, wenn ich die Shell mit "exit" beende.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12832
|
ratte13 schrieb: Ja, das ist ja quasi die selbe Frage 😉.
Ääääh...
Ich starte ein Programm mit "Programmname & exit", dann erscheint der Splash-Screen und es passiert nichts weiter.
Vielleicht wäre uns geholfen, wenn Du mal mitteilst, von welchem Programm Du sprichst. Eine Möglichkeit ist, dass der Prozess versucht, von der Konsole zu lesen: $ read -p 'hello: ' foo && echo $foo &
[1] 2880
$ hello:
[1]+ Stopped read -p 'hello: ' foo && echo $foo Sobald er vom Terminal lesen will, wird der Hintergrundprozess gestoppt. Das würde zumindest Deine Beobachtung erklären.
Ist das Programm bereits gestartet, so terminiert es allerdings nicht, wenn ich die Shell mit "exit" beende.
Ggf. ist es dann der erste Prozess, der weiter läuft. Manche Programme (z.B. Libre Office) lassen nur einen Prozess laufen.
|
ratte13
(Themenstarter)
Anmeldungsdatum: 15. August 2009
Beiträge: 240
|
Vielleicht wäre uns geholfen, wenn Du mal mitteilst, von welchem Programm Du sprichst. Eine Möglichkeit ist, dass der Prozess versucht, von der Konsole zu lesen:
Es handelt sich um Matlab. Wenn ich die Konsole mit "exit" verlasse während der Splash-Screen erscheint, so startet das Programm nicht. Danach schon.
Eine Möglichkeit ist, dass der Prozess versucht, von der Konsole zu lesen:
Kann ich das irgendwie feststellen?
|
ratte13
(Themenstarter)
Anmeldungsdatum: 15. August 2009
Beiträge: 240
|
|
chilidude
Anmeldungsdatum: 18. Februar 2010
Beiträge: 867
|
ratte13 schrieb: *PUSH*
Wenn ein Programm im Hintergrund als Job (also vom Terminal aus) gestartet wird, dann hat es das Terminal als Elternprozess. Wird nun der Elternprozess (in dem Fall das Terminal) beendet, so übernimmt der Initprozess (PID 1) stellvertretend die Elternschaft. (Jeder Prozess folgt einer Hierarchie.) Wartet der Prozess auf eine Eingabe, so wird er mit Signal 9 beendet. Ansonsten läuft er weiter.
Dazu ein Auszug aus "man 7 signal": The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored. ratte13
schrieb: Eine Möglichkeit ist, dass der Prozess versucht, von der Konsole zu lesen:
Kann ich das irgendwie feststellen?
Nachdem er beendet ist nicht mehr aber du kannst Matlab als Kind starten und den Signalweg protokollieren. (Ich würde das gar nicht weiter verfolgen denn es bringt dir keine neue Erkenntnis.)
|
chilidude
Anmeldungsdatum: 18. Februar 2010
Beiträge: 867
|
|