PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : offene fd's in prozessen ?



Mat
20-10-2005, 18:32
Hallo ich habe ein Verständnisproblem:

wenn ich ein file öffne und danach einen neuen prozess forke...

und in diesem kindprozess dann auf den dateideskriptor zugreife .....

müsste das nicht fehlschlagen ? Aber mit folgendem code:



#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

extern char **environ;

int main(int argc, char **argv)
{
pid_t child1;
FILE *file;
file = fopen("file.txt","r");
int fd;

while(1)
{
switch(child1=fork())
{
case -1 : printf("Error at fork()..........\n"); exit(0);
case 0 : printf("\nCHILD PROCESS\n");
fd = fileno(file);
printf("This is the access try to the file deskriptorbefore invoking fork():->%d",fd);
exit(1);
default : printf("\nPARENT PROCESS\n");

exit(2);
}
}
return 0;
}




kann ich locker auf den fd zugreifen?

Warum ?
Ich dachte mit dem neuen Prozess wird der gesamte stackinhalt vom urspurungsprozess durch den kindprozess überschrieben ... ?

Lord Kefir
21-10-2005, 10:56
Beim 'forken' wird eine 1 zu 1 Kopie vom Vaterprozess erzeugt. Der Unterschied bei beiden Prozessen ist nur die PID und die PPID. Dementsprechend bekommt das Kind auch die Deskriptoren - das denke ich mir jetzt zumindest ;) Habe bisher vor dem Funktionsaufruf immer alle FDs geschlossen...

Mfg, Lord Kefir

quinte17
21-10-2005, 12:04
ist es nicht sogar so, dass der geforkte prozess seine eigenen fd's hat? (sobald er darauf zugreift werden die glaub ich sogar dupliziert)

greetz

almoeli
21-10-2005, 12:12
Hi,

der geforkte Prozess erbt alle Filedescriptoren des Vaterprozesses. Allerdings als echte Kopie. Veränderungen an diesen Deskriptoren wirken sich also nicht mehr auf die Deskriptoren im Vaterprozess aus und umgekehrt.
Möchte man einen Deskriptor beim forken nicht vererben, so gibt man ihm die Eigenschaft FD_CLOEXEC:


fcntl(my_fd, F_SETFD, FD_CLOEXEC);

Damit wird dieser spezielle Filedeskriptor beim Aufruf von fork nicht vererbt, sondern für den Kindprozess geschlossen, also nicht mehr verfügbar. Der Vaterprozess behält diesen Deskriptor ganz normal weiter.

Gruß

almoeli

RapidMax
21-10-2005, 17:51
Die Eigenschaft wird auch gerne genutz um die Kommunikation mit dem Child zu ermöglichen:

anonyme pipe erzeugen
fork()
Parent schliesst ein Ende der Pipe
Child schliesst das andere Ende der Pipe
Nun können beide über die Pipe kommunizieren


Gruss, Andy