PDA

Visualizza la versione completa : [C] Generare 3 figli da un padre


giak.84
13-05-2010, 10:27
salve,
non sono un esperto di linux, però mi è stato chiesto di creare 3 figli SOLO da un padre..
questo codice che riporto sotto ha il difetto che anche i figli a loro volta generano un proprio figlio


#include<stdio.h>
#include<sys/types.h>
#define N 2
main()
{int id,i;
for(i=0;i<N;i++)
{id = fork();
if (id == 0) /* processo figlio */
{printf("\n(figlio %d) il mio id= %d\n",i,getpid());
printf("\n(figlio) id di mio padre = %d\n"i,getppid());
}
else /* processo padre */
{printf("\nsono il padre; risultato della fork = %d\n",n);
printf("\n(padre) mio id= %d\n",getpid());
}
}


so anche che per evitare tutto cio, devo fare in modo che se sono figli devo usare la funzione exit()

il problema è che non so fare questa modifica! qualcuno potrebbe aiutarmi? :bhò:

simo_us
13-05-2010, 19:20
A parte che il tuo codice genera un po di errori, solitamente è sempre meglio chiamare una exit(0) all'interno della condizione in cui crei il processo.
Vedi un po se questo codice ti schiarisce le idee;


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define NPR 3

int main(void)
{
int i;
pid_t pid[3]; /*array di processi*/

printf("I am the parent process with PID %d\n", getpid());

for(i=0;i<NPR;i++)
{
if((pid[i]=fork())==0)
{
printf("I am the son process with PID %d and my parent is %d\n", getpid(), getppid());
exit(0);
}
}
return 0;
}


Output:


~/Desktop$ gcc p.c -o p
~/Desktop$ ./p
I am the parent process with PID 7000
I am the son process with PID 7001 and my parent is 7000
I am the son process with PID 7002 and my parent is 7000
I am the son process with PID 7003 and my parent is 7000
~/Desktop$

:ciauz:

giak.84
13-05-2010, 21:43
Grazie simo_us la tua spiegazione è stata perfetta con tanto di esempio di esecuzione...GRAZIE DAVVERO!!!
:)

MacApp
14-05-2010, 02:01
Originariamente inviato da giak.84
mi è stato chiesto di creare 3 figli SOLO da un padre..

nel mondo dei computer si ragiona SOLO in potenza di due... ;-)

giak.84
14-05-2010, 11:25
Originariamente inviato da MacApp
nel mondo dei computer si ragiona SOLO in potenza di due... ;-)

Hai ragione MacApp, però il discorso cambia nel mondo dell'università..specialmente del Sud, dove se ne fregano della pratica e di ciò che chiede il mondo del lavoro!!
dove si buttano a capofitto su teoria o su tecniche arcaiche :old: o su tecniche che avranno fine solo per passare l'esame :ciauz: ..è di una tristezza ma intanto è questo! un giorno dovranno spiegarmi di cosa me ne faccio degli algoritmi genetici :dhò: se poi non so programmare in java!!!
cmq grazie per l'annotazione!!!!

simo_us
15-05-2010, 01:24
Grazie simo_us la tua spiegazione è stata perfetta con tanto di esempio di esecuzione...GRAZIE DAVVERO!!!
Di niente figurati! E' stato un piacere! :ciauz:

YuYevon
15-05-2010, 14:54
Il concetto è che, se non fai terminare l'i-esimo processo con una exit(), questo continuerà la sua esecuzione dopo l'else (che viene eseguito in maniera esclusiva dal processo padre) e genererà dunque anch'esso dei processi figli. Un esercizio interessante da fare (per comprendere la logica della gerarchia dei processi) sarebbe chiedersi ciascun processo figlio, a sua volta, quanti altri ne avrebbe generati senza la modifica della exit() (non tre di certo).

Comunque



Originariamente inviato da giak.84
specialmente del Sud, dove se ne fregano della pratica e di ciò che chiede il mondo del lavoro!!
dove si buttano a capofitto su teoria o su tecniche arcaiche :old: o su tecniche che avranno fine solo per passare l'esame :ciauz: ..è di una tristezza ma intanto è questo! un giorno dovranno spiegarmi di cosa me ne faccio degli algoritmi genetici :dhò: se poi non so programmare in java!!!


Vorrei spezzare una lancia a favore della sempre più umiliata università italiana, in particolare del Sud Italia.
Innanzitutto ti dico che non puoi generalizzare così. Ci sono corsi di laurea in informatica in cui si studiano anche Java e .NET (da me a Napoli, ad esempio), e in tutta sincerità ti dico che forse sarebbe meglio non farli, ma questa è solo una mia trascurabile considerazione. Ora la domanda da porsi è: una facoltà scientifica (perché ricordiamo che l'informatica è una scienza) deve formare lavoratori da dare in pasto alle aziende o scienziati?
Tra l'altro, se hai appena cominciato a studiare programmazione di sistema su Linux, cosa ti aspettavi di realizzare? E' chiaro che gli esercizi proposti sono sempre di natura didattica e risultano essere tanto bizzarri quanto inutili. A me capitò addirittura di realizzare una struttura di processi ad albero ternario (btw, non è vero che in informatica si ragiona sempre a potenze di due; non ad alto livello, almeno) creando una procedura ricorsiva. Un esercizio certamente assurdo, inutile, ma di un grande potenziale didattico, innegabilmente.

In tutta sincerità, se dovesse capitarmi (come succede al Politecnico di Milano, parola di chi lo frequenta) di studiare C, C++ e programmazione di sistema su Unix per la prima volta all'interno di un singolo corso mi guarderei bene dal definire buono il mio ateneo, o comunque la mia facoltà. E stiamo parlando di un'università del Nord, tra le più blasonate e... finanziate.

mazzy89
08-05-2011, 12:57
mi unisco al topic (se pure vecchiotto) dato che anche io sto affrontando questo argomento.la cosa pazzesca e molto strana è che pur copiando lo stesso codice ottengo un output diverso.




Inizio programma
Processo Padre: [600]
Sono il processo figlio PID=[601] generato dal padre PID=[600]
Sono il processo figlio PID=[602] generato dal padre PID=[1]

perché invece di ottenere il PID del procesos padre ottengo 1?che vuol dire?eppure il codice è lo stesso a quello proposto


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

#define NPR 2

int main (void)
{
int i;
pid_t child_pid[2];

printf("Inizio programma\n");

printf("Processo Padre: [%d]\n", getpid());

for(i=0;i<NPR;i++)
{
if((child_pid[i]=fork())==0) //ci troviamo nel contesto del figlio
{
printf("Sono il processo figlio PID=[%d] generato dal padre PID=[%d]\n", (int) getpid(), (int) getppid());
exit(0);
}
}
return 0;
}

deleted_29
08-05-2011, 13:05
Originariamente inviato da giak.84
un giorno dovranno spiegarmi di cosa me ne faccio degli algoritmi genetici :dhò: se poi non so programmare in java!!!
è un vecchio thread, ma ti servira 10000 volte più conoscere "bene" i genetici, piuttosto che programmare in java.

ragionieri programmatori in java li trovi dietro ogni angolo, e vengono tipicamente assunti a livello di operai.

uno che ti sappia ottimizzare il taglio di una materia prima per minimizzare gli scarti, in tempo reale, tipicamente guadagna 10 (o anche 100 volte) il programmatore java.

così, tanto per dare un'idea di cosa è importante nel mondo del lavoro :ciauz:

deleted_29
08-05-2011, 13:11
Originariamente inviato da YuYevon
(...)Vorrei spezzare una lancia a favore della sempre più umiliata università italiana(...)E stiamo parlando di un'università del Nord, tra le più blasonate e... finanziate.
Io invece ti segnalo che TUTTE le università italiane sono pessime, nord, sud, est ed ovest.
A livello mondiale sono considerate pochissimo (e giustamente, aggiungo io).
La "rivoluzione" 3+2 ha distrutto quella che era una (buona, non eccezionale) università trasformandola in una pessima imitazione di un buon ex-liceo.

Non fatevi quindi particolari illusioni: studiate pure nell'università X,Y o Z (italiana): avrete una pessima preparazione al nord, centro e sud :zizi:

Loading