Umgang mit Speicherstrukturen, Descriptoren u.anderes nach fork()

01/10/2015 - 13:46 von Siegfried Schmidt | Report spam
Hallo,

was ist denn in einem Tochterprozess ein "nogo" oder "best praktice"
bezüglich dem Umgang mit vom Parent geerbten Dateistrukturen,
Dateidescriptoren, Sockets, Syslog-Verbindung, Signalhandler, etc.?

Soll/darf man im Child nicht mehr notwendigen Speicher freigeben, welcher
durch den Parent angefordert wurde?

Soll man alle nicht im Child benötigten offenen Dateien schliessen?

Soll man im Child offene Netzwerksockets schliessen? Wird damit die TCP-
Session des Parents beeinflusst?

Soll man durch Libs geöffnete Sockets (z.B. Verbindung zu
Datenbankserver) beenden und neu verbinden oder nur neu verbinden ohne zu
beenden?

Soll man im Child ein openlog() wiederholen (auch wenn man keine andere
ident braucht)?

Muss man Signalhandler im Client nochmal setzen?

Gibt es für diesen Themenbereich eine hilfreiche Quelle?


Siegfried


Diese Nachricht kann zukunftsgerichtete Aussagen beinhalten, diese sind
mit Risiken und Ungewissheiten verbunden und basieren auf gegenwàrtigen
Erwartungen. Die tatsàchlichen Ereignisse können daher wesentlich von den
Darstellungen abweichen.
 

Lesen sie die antworten

#1 Michael Baeuerle
01/10/2015 - 16:01 | Warnen spam
Siegfried Schmidt wrote:

was ist denn in einem Tochterprozess ein "nogo" oder "best praktice"
bezüglich dem Umgang mit vom Parent geerbten Dateistrukturen,
Dateidescriptoren, Sockets, Syslog-Verbindung, Signalhandler, etc.?

Soll/darf man im Child nicht mehr notwendigen Speicher freigeben, welcher
durch den Parent angefordert wurde?



Da der Speicher im Child eine Kopie ist, darf man ihn dort auch frei-
geben (oder er bleibt eben weiterhin belegt). Beispiel:

#define _POSIX_C_SOURCE 200809L

#include <sys/wait.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(void)
{
int res = EXIT_SUCCESS;
pid_t rv;
int stat_loc;
pid_t pid = fork();
char *string;

/* Allocate some memory */
string = (char*) malloc((size_t) 256);
strcpy(string, "Test");

/* Spawn child */
if(!pid)
{
/* Child */
printf("Child: %s", string);

/* Release copy of memory */
free((void*) string);

_exit(EXIT_SUCCESS);
}

/* Wait for child to terminate */
do
{
rv = wait(&stat_loc);
}
while(-1 == rv && EINTR == errno);
if(pid != rv || (pid == rv && EXIT_SUCCESS != stat_loc))
{
printf("Failed");
res = EXIT_FAILURE;
}

/* Use parent's copy of memory */
printf("Parent: %s", string);

/* Release memory */
free((void*) string);

exit(res);
}


Soll man alle nicht im Child benötigten offenen Dateien schliessen?



Kann man tun. Oder man setzt "O_CLOEXEC" beim öffnen im Parent, wenn man
im Child 'exec()' ausführen will. Siehe:
<http://pubs.opengroup.org/onlinepub...n.html>

Ähnliche fragen