fracarro
26-03-2008, 20:06
Salve ragazzi. Avrei bisogno di una consulenza per un problemino che mi sta dando filo da torcere.
Consideriamo il codice qui sotto:
int main(){
struct rlimit limitbuf;
int i;
getrlimit(RLIMIT_CPU, &limitbuf);
limitbuf.rlim_cur = 3602;
limitbuf.rlim_max = 3700;
setrlimit(RLIMIT_CPU, &limitbuf);
if( signal(SIGXCPU,GestoreKill)==SIG_ERR ){
printf("errore di ritorno della signal (SIGXCPU).\n");
exit(0);
}
for(i=1;1<k;i++)
system("gambit <input_file | head-1 >output_file");
................
................
return 1;
}
In pratica dopo 3602 secondi se il programma sta ancora girando viene generato il segnale di SIGXCPU che la funzione GestoreKill cattura e fa delle cose che non ci interessano. Il problema è questo. Io vorrei che a partire dalla prima istruzione del main cominci il conteggio di questi 3602 secondi e che in questo conteggio venga considerato anche il tempo che trascorre durante la chiamata al gambit. Invece il segnale viene lanciato dopo che il tempo di CPU utilizzato dal programma "escluso il tempo di cpu utilizzato dal programma esterno invocato tramite la system" raggiunge i 3602 secondi. Ovviamente questo è frustrante perchè se per esempio la system richiede 30 minuti il mio programma verrà ammazzato dopo 3602+30*k minuti. C'è un modo per far si che il segnale venga inviato dopo 3602 secondi di utilizzo di CPU da parte del programma e dei programmi esterni da esso invocati?
P.S. Ovviamente usare un alarm non va bene perchè quella conterebbe il tempo di sistema e non quello di cpu.
P.P.S. Un'alternativa alla system potrebbe essere quella di usare una fork per creare un processo figlio e tramite una execl inviare il comando shell ma non so se in questo modo il tempo di cpu usato dal padre e dal figlio venga sommato e soprattutto ho avuto vari problemi nell'utilizzare la execl per lanciare il comando shell. Idee?
Consideriamo il codice qui sotto:
int main(){
struct rlimit limitbuf;
int i;
getrlimit(RLIMIT_CPU, &limitbuf);
limitbuf.rlim_cur = 3602;
limitbuf.rlim_max = 3700;
setrlimit(RLIMIT_CPU, &limitbuf);
if( signal(SIGXCPU,GestoreKill)==SIG_ERR ){
printf("errore di ritorno della signal (SIGXCPU).\n");
exit(0);
}
for(i=1;1<k;i++)
system("gambit <input_file | head-1 >output_file");
................
................
return 1;
}
In pratica dopo 3602 secondi se il programma sta ancora girando viene generato il segnale di SIGXCPU che la funzione GestoreKill cattura e fa delle cose che non ci interessano. Il problema è questo. Io vorrei che a partire dalla prima istruzione del main cominci il conteggio di questi 3602 secondi e che in questo conteggio venga considerato anche il tempo che trascorre durante la chiamata al gambit. Invece il segnale viene lanciato dopo che il tempo di CPU utilizzato dal programma "escluso il tempo di cpu utilizzato dal programma esterno invocato tramite la system" raggiunge i 3602 secondi. Ovviamente questo è frustrante perchè se per esempio la system richiede 30 minuti il mio programma verrà ammazzato dopo 3602+30*k minuti. C'è un modo per far si che il segnale venga inviato dopo 3602 secondi di utilizzo di CPU da parte del programma e dei programmi esterni da esso invocati?
P.S. Ovviamente usare un alarm non va bene perchè quella conterebbe il tempo di sistema e non quello di cpu.
P.P.S. Un'alternativa alla system potrebbe essere quella di usare una fork per creare un processo figlio e tramite una execl inviare il comando shell ma non so se in questo modo il tempo di cpu usato dal padre e dal figlio venga sommato e soprattutto ho avuto vari problemi nell'utilizzare la execl per lanciare il comando shell. Idee?