Newsgroup: it.comp.os.linux.development
Titolo: Curiosita' fork

Salve a tutti,
stavo iniziando a scrivere qualche programmino e tentavo di capire bene
l'uso delle fork. In pratica quando creo il processo figlio e tento di
mandare a video il pid del processo padre mi da' 1. Questo cosa significa?
Che il processo padre e' terminato e quindi il processo figlio e' rimasto
orfano?
Penso che sia cosě ma volevo la conferma. Inoltre anche se funzionasse č
buona prassi usare un sistema del genere o puň dare problemi?
Inoltre quindi un processo figlio puo' sopravvivere anche se il padre muore?
Ultima cosa: dove posso trovare della documentazione che mi spieghi come
fare un programma che una volta lanciato torni il 'prompt' alla shell e
anche se questa viene chiusa il programma rimane in memoria?
Grazie
Gianni
Ecco il programma allegato:
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <iostream>
#include <cstdlib>
//includes necessari per il fork
#include <sys/types.h>
#include <unistd.h>
using namespace std;
int main(int argc, char *argv[])
{
  pid_t pid_figlio;
  pid_t pid_padre;
  pid_t pid_corrente;
  cout << "Avvio programma." << endl;
  pid_figlio=fork();
  if (pid_figlio==-1) //-1 se non ci sono risorse per creare il figlio
  {
    cout << "Errore durante la creazione del figlio." << endl;
  }
  else
  {
    if (pid_figlio==0) //0 viene ritornato al programma figlio
    {
      cout << "Questo e' il programma figlio" << endl;
      pid_padre=getppid(); //perche' torna 1? 1 e' il sistema
      cout << "Il pid del padre e' " << pid_padre << endl;
    }
    else
    {
      //altrimenti ritorna il pid del figlio al padre
      cout << "Il pid del figlio e' " << pid_figlio << endl;
    }
  }
  pid_corrente=getpid();
  cout << "Il pid del processo e' " << pid_corrente << endl;
  cout << "Fine programma!" << endl;
  return EXIT_SUCCESS;
}

 
Ciao
Matic

 (occhio solo che gli stdout e stderr ti incasinano la shell dopo :P)
Ok allora se lancio un programma da una shell, faccio una fork e creo un
figlio e vado in exit con il padre e il figlio rimane in memoria a lavorare.
Ma a questo punto che succede se chiudo la shell? Il figlio continua a
lavorare finchè non và in exit anche lui?
Gianni

 continua a lavorare finchè non và in exit anche lui?
Non sono le shell ad ereditare i processi,
è il processo init a prendersi cura di effettuare
la "pulizia" dei processi rimasti orfani di padre.
Per vedere un po' di caratteristiche dei processi:
ps -axj
prova ad avviare un programma con una esecuzione
lunga in background, esci con ^D e rientra come
un altro utente, dunque dai un occhiata ai processi...
(prima che il processo in background termini...)
SiMoStro

 </code>
Bisognerebbe chiamare anche setsid() in modo da staccarsi dal tty
(altrimenti ci si becca un SIGHUP se il terminale viene chiuso). Se poi lo 
scopo e` fare un demone allora stdin/stdout/stderr vanno chiusi.
Luca
-- 
Home: 
http://kronoz.cjb.net
I went to God just to see
And I was looking at me
Saw heaven and hell were lies
When I'm God everyone dies

 scopo e` fare un demone allora stdin/stdout/stderr vanno chiusi.
Grazie a tutti per le info,
per adesso non ho nessuno scopo, stò soltanto cercando di prendere
conoscenza dei mezzi.
Gianni

tutto quello che ti hanno detto
(forkare, staccarsi dalla tty, in poche parole
diventare un demone) è stato incluso nella syscall
daemon() in stdlib.h;
man daemon e salta fuori la documentazione.