|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Nov 2000
Messaggi: 342
|
fork
Ciao,
ho iniziato a cimentarmi con C ed ora sono arrivato alle fork. Ho fatto questo programmino stupido: #include <unistd.h> #include <stdio.h> #include <sys/types.h> int main() { pid_t pid; pid = fork(); if (pid == -1 ) { fprintf(stderr,"forkfallita\n"); exit(1); } if (pid == 0) { printf("FIGLIO --------- Mio PID %d\n",getpid()); printf("FIGLIO --------- PID del padre %d \n",getppid()); exit(0); } if (pid > 0) { printf("PADRE ----------- Sono il padre %d \n",getpid()); printf("PADRE ----------- PID del filgio %d\n",pid); exit(0); } printf("------------------------------\n"); exit(0); } però non capisco alcun cose: 1) perchè l'output non è sempre lo stesso? ovvero, pid a parte, perchè le istruzioni non vengono eseguite sempre nello stesso ordine? FIGLIO --------- Mio PID 6291 FIGLIO --------- PID del padre 6290 PADRE ----------- Sono il padre 6290 PADRE ----------- PID del filgio 6291 PADRE ----------- Sono il padre 6298 FIGLIO --------- Mio PID 6299 FIGLIO --------- PID del padre 6298 PADRE ----------- PID del filgio 6299 2) perchè se uso ddd per debaggare il programma mi si stampa solo le informazioni inerenti al padre? 3) chi mi spiega come posso "lavorare" sul padre o sul figlio? Nel frattempo continuerò a studiare. ![]() ciao Arpeda
__________________
Membro di HWU Scout Group || Quello che ieri era fantascienza oggi è realtà, quello che oggi è realtà domani sarà solo un ricordo ... Powered by Gentoo 1.4 on kernel 2.6.12.-gentoo-r4 |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
E' ovvio che possono essere stampati in ordine diverso, una volta che padre e figlio sono creati, la loro esecuzione è asincrona. Chi viene eseguito e quando è deciso dallo scheduler.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2000
Messaggi: 342
|
perche se eseguo questo codice e passo come comando date funziona e se invece passo ls non va?
#include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> char * read_command() { char *command; scanf("%as",&command); return command; } int main () { char *command; int pid,*status; command=read_command(); if ((pid=fork()) !=0) { waitpid(-1,status,0); printf("Il processo figlio %d &#65533; uscito con lo stato %d\n",pid,*status); } else { execvp(command,NULL); } exit(0); } ciao Arpda
__________________
Membro di HWU Scout Group || Quello che ieri era fantascienza oggi è realtà, quello che oggi è realtà domani sarà solo un ricordo ... Powered by Gentoo 1.4 on kernel 2.6.12.-gentoo-r4 |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Perchè passi NULL ad argv di ls. Evidentemente questo confonde ls.
Codice:
@@ -14,6 +14,7 @@ int main () { char *command; +char *cmdarr[2]; int pid,*status; command=read_command(); @@ -22,7 +23,9 @@ printf("Il processo figlio %d è uscito con lo stato %d\n",pid,*status); } else { -execvp(command,NULL); +cmdarr[0] = command; +cmdarr[1] = NULL; +execvp(command,cmdarr); } exit(0); }
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:04.