Erklärung Codezeilen mit close() und dup()

Krikus

Mitglied
Hallo zusammen,

ich bräuchte einmal Eure Hilfe. Ich verstehe so einige Zeilen Code in einem Programm nicht.

Hier erst einmal der Code:

C:
//Socket wird generiert etc
.........

  (void) signal(SIGCHLD, reaper);

  while (1)
    {
      client_len = sizeof(client_addr);
      newsockfd = accept(sockfd, &client_addr, &client_len); //Verbindung akzeptieren, ist eine Blocking Call
      if (newsockfd < 0) 
	{
	  perror("accept");
	  exit(1);
	}
  
      pid = fork(); //erstellt einen Child-Prozess. //returns 0, we are in the child process. 
//returns a positive number, we are in the parent process (the fork return value is the PID of the newly created child process).


      
      if (pid == 0)
	{
	  close(0); //close stdin ****?
	  close(1);
	  close(2);
	  
	  dup(newsockfd);
	  dup(newsockfd);
	  dup(newsockfd);
	  close(newsockfd);
	  
	 //testfunktion();
	  fflush(stdout);
	  close(0);
	  close(1);
	  close(2);
	  
	  exit(0);
	}
      close(newsockfd);
    }
.....

Meine erste Frage, wozu wird die signal() Funktion benötigt.

Danach springt das Programm in die While-Schleife und wartet auf eine eingehende Verbindung und akzeptiert diese. Dann wird ein Child-Prozess mit fork() erstellt, damit der Parent-Prozess nicht blockiert und weitere Anfragen entgegen nehmen kann.
In dem Child-Process wird nun in die if-Bedingung gesprungen.
Was nun dort mit den close() und dup() gemeint ist, weiß ich nicht und müsste mir einer erklären.


Gruß

Krikus
 
Hi.

Mit signal kann man auf Signale reagieren, es wird dann die gegebene Funktion aufgerufen. :rtfm:

Ja, die close aufrufen schließen stdin, stdout und stderr (welche vom Eltenprozeß geerbt wurden).

Die dup aufrufen setzen stdin, stdout und stderr auf eine Kopie von newsockfd.

Also wird z.B. bei printf nicht auf die Konsole (normale Standardausgabe) geschrieben, sondern auf den Socket.

Das steht doch aber alles in den Manpages... :rtfm:

Warum suchst du denn nicht mal?

Gruß
 
Zurück