Log in

View Full Version : Linguaggio C



Hardcore
2nd March 2008, 10:47
Ho una problema secondo me con la fork che nn capisco bene cosa faccia, allora il programma ottiene da input il valore di quanti processi deve creare, ogni processo stampa su output chi è e poi muore. Il mio probelma, che ho in tutti i programmi in cui ho un numero di processi figli superiore a 1 è questo:
quando il padre va a fare else printf("\nCreato Figlio con PID %d",pid);
mi scrive sia Creafto Figlio con pid del figlio precedente e poi anche Creato Figlio del pid del figlio attuale:
faccio copia e incolla di uno stdout con 3 figli...

Sono il figlio n: 1
Creato Figlio con PID 6605
Sono il figlio n: 2Creato Figlio con PID 6605
Creato Figlio con PID 6606
Sono il figlio n: 3Creato Figlio con PID 6606
Creato Figlio con PID 6607
Processo [6605] Terminato
Processo [6606] Terminato
Processo [6607] Terminato

Qualcuno ha la piu pallida idea di perke faccia cosi? io nn riesco a darmi pace non trovo il motivo...anche col debug lo fa e nn capisco..

-------------------CODICE---------------
/* INTERFACCIA FORK */
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
void figlio(int i);
void main(int argc,char **argv){

int a= 0;
int pid;
int status;
int nfigli;
if (argc <2){printf ("Errore numero parametri passato errato\n");
exit (1);
}
nfigli= atoi(argv[1]);
for (a=0;a<nfigli;a++){

pid =fork();
if (pid == 0){//Figlio
figlio(a);

} //Padre
else printf("\nCreato Figlio con PID %d",pid);
}
for(a=0;a<nfigli;a++){

pid=wait(&status);
printf("\nProcesso [%d] Terminato ",pid);
}

exit (0);

}
void figlio(int i){
printf("\nSono il figlio n: %d",i+1);
exit (0);

}

elroniel
2nd March 2008, 11:13
prova a mettere la parentesi graffa subito dopo l'else

Hardcore
2nd March 2008, 11:53
nulla cambia niente..

ho notato però che se invece di fare printf, io scrivo:

snprintf(stringa,"Il processo %d è terminato",pid);
write (1,stringa,strlen(stringa));

non me lo ripete ma per ognuno me ne scrive uno come dovrebbe giustamente funzionare...il motivo qual'è ....

Brcondor
2nd March 2008, 17:27
prova a mettere la parentesi graffa subito dopo l'else
ammazza che niubbo, c'è solo 1 istruzione dopo l'else ed erwa giusto:clap::clap::clap::clap::clap::clap:

elroniel
3rd March 2008, 16:37
ammazza che niubbo, c'è solo 1 istruzione dopo l'else ed erwa giusto:clap::clap::clap::clap::clap::clap:
mio voto<---27(esame da 10 crediti)
tuo voto<---24(esamino da 7,5 crediti) no ma GG:sneer::sneer:

da questa attenta analisi
mia conoscenza di c>tua
(scusa se ho spammato nel tuo post)

Hardcore
8th March 2008, 11:52
riuppo perchè ho un nuovo problema questa volta molto piu fine :look:

Devo leggere da file riga per riga e salvare ciascuna in una stringa, io non conosco purtroppo a priori la dimensione di una riga,leggo un carattere e lo scrivo, e cosi via...esiste un mondo per allocare in modo dinamico sta stringa? cioè parti con dimensione 1, se scrivo allora aumenta da sola di dimensione, cioè fin che ti sto scrivendo sopra tu ingrandisciti...??

Axet
9th March 2008, 14:12
Non ricordo un tubo di C che lo usavo 30 anni fa, ma ci sarà sicuramente un comando per leggere direttamente la riga intera.
Spulciati la documentazione vedrai che lo trovi :D

Kith
9th March 2008, 14:17
Invece non son così sicuro che ci sia, almeno quando usavamo C alle superiori ci facevano fare un ciclo che leggeva il carattere di indice i fino al carattere "tappo" e li salvava man mano in una stringa....

Axet
9th March 2008, 14:19
Dici? Boh mi par molto strano, leggere un intera riga da file di testo è roba comune.. cmq come detto C non lo uso da secoli quindi di più nin zò

Kith
9th March 2008, 14:26
Boh non ne sono sicuro al 100% però mi ricordavo sta cosa del carattere di tappo (che in sostanza è un carattere che ti dice che la stringa è finita), quindi pur essendo abituato al java in cui una roba del genere è routine, ho pensato che forse in C non era implementato... però mai dire mai :D

Hardcore
9th March 2008, 14:32
@axet: precisazione quello che dici tu esiste, ma è all'interno di una serie di librerie e comandi che non posso usare, fa parte dei vari fopen ecc, il mio è un esame su Sistemi Operativi (precisamente unix), si utilizza quindi open close, e la tabella dei file aperti, e purtroppo tale comando non esiste,per questo chideve se esiste un metodo per creare un array che aumentana automaticamente di dimensione in caso di scrittura e di stato full, in java so per certo che ci sia, non vorrei che in C non ci sia mai stato :look:

San Vegeta
9th March 2008, 23:35
Ho una problema secondo me con la fork che nn capisco bene cosa faccia, allora il programma ottiene da input il valore di quanti processi deve creare, ogni processo stampa su output chi è e poi muore. Il mio probelma, che ho in tutti i programmi in cui ho un numero di processi figli superiore a 1 è questo:
quando il padre va a fare else printf("\nCreato Figlio con PID %d",pid);
mi scrive sia Creafto Figlio con pid del figlio precedente e poi anche Creato Figlio del pid del figlio attuale:
faccio copia e incolla di uno stdout con 3 figli...
Sono il figlio n: 1
Creato Figlio con PID 6605
Sono il figlio n: 2Creato Figlio con PID 6605
Creato Figlio con PID 6606
Sono il figlio n: 3Creato Figlio con PID 6606
Creato Figlio con PID 6607
Processo [6605] Terminato
Processo [6606] Terminato
Processo [6607] Terminato
Qualcuno ha la piu pallida idea di perke faccia cosi? io nn riesco a darmi pace non trovo il motivo...anche col debug lo fa e nn capisco..
-------------------CODICE---------------
/* INTERFACCIA FORK */
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
void figlio(int i);
void main(int argc,char **argv){
int a= 0;
int pid;
int status;
int nfigli;
if (argc <2){printf ("Errore numero parametri passato errato\n");
exit (1);
}
nfigli= atoi(argv[1]);
for (a=0;a<nfigli;a++){
pid =fork();
if (pid == 0){//Figlio
figlio(a);
} //Padre
else printf("\nCreato Figlio con PID %d",pid);
}
for(a=0;a<nfigli;a++){
pid=wait(&status);
printf("\nProcesso [%d] Terminato ",pid);
}
exit (0);
}
void figlio(int i){
printf("\nSono il figlio n: %d",i+1);
exit (0);
}

l'unica cosa che mi vien da pensare senza fare un debug è che ereditando le variabili dal padre, eredita anche i valori attuali delle variabili coinvolte nel ciclo for e nella funzione di stampa

San Vegeta
9th March 2008, 23:38
riuppo perchè ho un nuovo problema questa volta molto piu fine :look:
Devo leggere da file riga per riga e salvare ciascuna in una stringa, io non conosco purtroppo a priori la dimensione di una riga,leggo un carattere e lo scrivo, e cosi via...esiste un mondo per allocare in modo dinamico sta stringa? cioè parti con dimensione 1, se scrivo allora aumenta da sola di dimensione, cioè fin che ti sto scrivendo sopra tu ingrandisciti...??

no in C la prassi è allocare un array di char di dimensione prefissata N e leggere al max N caratteri per volta.

fare quello che vuoi far tu è oneroso, ma è essenzialmente il meccanismo che usano le List, ArrayList e compagni in java: hanno un buffer interno che viene ricreato più grande se gli oggetti da inserirvi superano le dimensioni correnti