|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
[C unix] fork
ciao a tutti, ho bisogno di capire come fare per risolvere un problema.
Devo svolgere un esercizio e mi sono bloccata nella prima parte...precisamente un padre crea N processi figli con N pari e ciascun processo figlio è identificato da una variabile intera (i=0...N-1); poi continua...ma sn ferma qui. Ho scritto questa prima parte di codice ma non mi funziona...in output ottengo + pid[i] del dovuto e non so per quale motivo. Qualcuno potrebbe dirmi come posso risolvere questo problema e perchè così nn va? Codice:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <signal.h>
#include <stdlib.h>
int N;
int main(int argc, char *argv[])
{
pid_t pid[N];
int i;
if(argc!=2)
{
printf("Errore nell'utilizzo del programma!\n");
printf("./es1_1411 <N>\n");
exit(-1);
}
N=atoi(argv[1]);
if((N%2)==0)
printf("Il numero (N) inserito è pari: %d\n",N);
else
{
printf("Il numero (N) inserito è dispari: %d\n",N);
printf("Cio' comporta l'uscita dal programma...\n");
exit(-2);
}
i=0; //Parte critica!
while(i<N)
{
pid[i]=fork();
if(pid[i]==0)
{
printf("pid[%d]: %d\n",i,getpid());
}
i++;
}
return 0;
}
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Hai fatto un piccolo errore, nel tuo codice anche i child continuano il ciclo while e a loro volta si mettono a forkare e creare altri child.
__________________
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 |
|
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
mmm...come devo migliorare il codice per farsì che cio' nn avvenga?
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Usa break per uscire dal ciclo. Qualcosa del genere:
Codice:
for (i=0; i<N; ++i)
if ((pid[i] = fork()) == 0)
break;
else
printf("Creato child: pid[%d]=%d\n", i, pid[i]);
__________________
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 |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
grazie mille...avrei un'altra domanda da porre in relazione ai processi...
In particolare, se io genero due processi figli che eseguono due compiti, come faccio a stabilire chi termina per primo e notificare il tutto con un segnale tra processi? -genero figlio 1 e fa qualcosa -genero figlio 2 e fa qualcosa -stabilire chi termina per primo? -notificare questo evento? Grazie...in anticipo |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quando un child termina, il padre riceve un SIGCHLD. V. man sigaction per come gestirlo e ricavare il pid.
__________________
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: 06:36.



















