Forums Neueste Beiträge
 

Verständnisfrage zu fork()

13/11/2013 - 09:40 von Anonym | Report spam
Was passiert bei fork() mit der Zuordnung von Prozess und Terminal?

Ich denke mal, stdin und stdout werden von beiden Prozessen
"konkurrierend" genutzt, Ausgaben der Prozesse auf stdout erscheinen auf
dem Terminal, Eingaben erscheinen auf stdin und werden von dem Prozess,
der sie zuerst liest, "weggelesen", also aus der Qeue genommen?

Was passiert bei Signals? (Ctrl-C, Ctrl-D,.)?


Darf ich mir das wie bei Event und Eventhandler vorstellen? Sprich:
fork() registriert den neu geschaffenen Prozess als "Listener" beim
Terminaltreiber und ein Signal des Terminaltreibers wird an alle
registrierten Listener geschickt?

Also in einer Shell hàtte ich dann etwa:

signal (SIGINT, tue_nichts);

if (pid=fork()){
wait(pid);
} else [

// schmeiß den "tue_nichts Handler" raus

execve(irgendwas);

}

Oder was passiert da?
 

Lesen sie die antworten

#1 Rainer Weikusat
13/11/2013 - 14:48 | Warnen spam
Anonym writes:
Was passiert bei fork() mit der Zuordnung von Prozess und Terminal?

Ich denke mal, stdin und stdout werden von beiden Prozessen
"konkurrierend" genutzt, Ausgaben der Prozesse auf stdout erscheinen auf
dem Terminal, Eingaben erscheinen auf stdin und werden von dem Prozess,
der sie zuerst liest, "weggelesen", also aus der Qeue genommen?

Was passiert bei Signals? (Ctrl-C, Ctrl-D,.)?


Darf ich mir das wie bei Event und Eventhandler vorstellen? Sprich:
fork() registriert den neu geschaffenen Prozess als "Listener" beim
Terminaltreiber und ein Signal des Terminaltreibers wird an alle
registrierten Listener geschickt?



IIRC wird SIGINT an alle Mitglieder der 'foreground process group'
geschickt, dh an beide Prozesse. ^D loest kein signal aus sondern
'ueberfuehrt' den Eingabe-Kanal in einen EOF-Zustand der von beiden
Prozessen gelesen wird. Einem Test mit ./a.out </var/log/syslog zufolge
verhaelten sich Ein- und Ausgaben wie von Dir vermutet.

Testprogram [*]
#include <stdio.h>
#include <unistd.h>

int main(void)
{
char buf[4096];

fork();
while (gets(buf)) {
printf("%ld: %s", getpid(), buf);
}

return 0;
}


[*] Auch gets ist fuer irgendetwas gut.

Ähnliche fragen