Scusate se questi giorni posto molte discussioni, ma voglio cercare di capire il tutto bene...
Ho quest'altro programmino che genera n figli, con n passato come argomento da terminale(non badate alla non presenza dei controlli sugli argomenti passati), funziona correttamente fino a 3 figli, oltre da problemi strani, a volte si blocca in attesa di non si sa cosa, altre volte da un errore lunghissimo che riporto in fondo al post
Codice PHP:
#include "stdio.h"
#include "stdlib.h"
#include "unistd.h"
#include "signal.h"
int sigCounter=0; //contatore che indica il numero di figli attualmente "in circolazione"
void generaFiglio(int n)
{//sleep(1); //se inserisco questa sleep il programma gira correttamente
int pid=(int)fork();
sigCounter++;
if(pid==0)
{
exit(n);
}
if(pid<0)
{
sigCounter--;
perror("fork error");
exit(1);
}
}
void catturaSegnale(int num)
{
printf("%d ha ricevuto il segnale SIGCHLD(%d)\n", (int)getpid(), num);
sigCounter--;
}
int main(int argc, char **argv)
{
int status;
int nFigli=atoi(argv[1]); // numero di figli da generare preso da terminale
signal(SIGCHLD, catturaSegnale);
int i;
int pid;
for(i=0; i<nFigli; i++) // genero nFigli
generaFiglio(i);
while(sigCounter>0); //attendo che tutti i SIGCHLD siano stati ricevuti
printf("Tutti i segnali SIGCHLD ricevuti!\n");
for(i=0; i<nFigli; i++) //stampo il PID e l'exit status di tutti i figli
{
pid=(int)wait(&status);
printf("PID=%d - Exit status=%d\n", pid, status);
}
exit(0);
}
quest'errore appare mentre sta ancora ricevendo i vari SIGCHLD
codice:
es2: ../nptl/sysdeps/unix/sysv/linux/x86_64/../fork.c:211: __libc_fork: Assertion `({ __typeof (({ struct pthread *__self; asm ("mov %%fs:%c1,%0" : "=r" (__self) : "i" (__builtin_offsetof (struct pthread, header.self))); __self;})->tid) __value; if (sizeof (__value) == 1) asm volatile ("movb %%fs:%P2,%b0" : "=q" (__value) : "0" (0), "i" (__builtin_offsetof (struct pthread, tid))); else if (sizeof (__value) == 4) asm volatile ("movl %%fs:%P1,%0" : "=r" (__value) : "i" (__builtin_offsetof (struct pthread, tid))); else { if (sizeof (__value) != 8) abort (); asm volatile ("movq %%fs:%P1,%q0" : "=r" (__value) : "i" (__builtin_offsetof (struct pthread, tid))); } __value; }) == ppid' failed.
Annullato (core dump creato)
(es2 è il nome del programma)
da cosa può dipendere questo problema? ho visto che aggiungendo una sleep(1) in generaFiglio il programma gira anche passando 10, quindi sembra quasi un problema di velocità