PDA

View Full Version : [C] ADDORMENTARE E SVEGLIARE UN PROCESSO


eaangi77
03-10-2007, 20:00
Ciao scusate il disturbo ho un problema,

ho un processo addormentato con pause() che ha creato 4 thread , vorrei risvegliarlo ma utilizzando kill(0,0) non funziona.

Qualcuno può aiutarmi grazie.



Posto il codice.

void controllore(){
while ("true"){
msgrcv (ID_CODA, &messaggio_ricevuto, 5, 1 , MSG_NOERROR );

if (messaggio_ricevuto.mtext == 0){
printf("CONTROLORE SVEGLIA IL CUOCO \n");
raise(SIGUSR1);
}

}
}


static void gestioneSegnali(int segnale){
printf("SEGNALE CATTURATO");
segnalep = 1;
return ;

}


int main() {

ipc_key_coda = ftok(".", 'a');
ID_CODA = msgget(3, IPC_CREAT | 0600);

ipc_key = 1;
sem_id_camerieri = MutexCreate(ipc_key);

f_lettura_portate_ordinate = fopen ( "./portateOrdinate" , "r" );

signal(SIGUSR1,gestioneSegnali);

do{
if (f_lettura_portate_ordinate){

if (!feof(f_lettura_portate_ordinate)){
printf("Portata Lavorata: %s \n", &portata);
printf("\n");
fgets(&portata, 50, f_lettura_portate_ordinate);
sleep(2);

}else{

printf("ADDORMENTA CUOCO \n");
while (segnalep==0) ; //pause(); Pause non risvegliato dal segnale!!! Problema con i thread
printf("CUOCO SVEGLIATO\n");
segnalep=0;
fgets(&portata, 50, f_lettura_portate_ordinate);


}

} else {
printf("ERRORE NELL'APERTURA DEL FILE \n");
}


}while ("true");

printf("TERMINE CUOCO \n");

fclose(f_lettura_portate_ordinate);

return 0;

}

ilsensine
04-10-2007, 10:58
kill(pid, 0) controlla solo che il processo esista, non invia nessun segnale.

ilsensine
04-10-2007, 11:04
Ah e la raise invia il segnale al thread corrente, non al thread principale. La documentazione dice che è implementato come kill(getpid(), ...) ma scommetterei che in realtà usa kill(gettid(), ...).

eaangi77
04-10-2007, 23:55
Ok, quindi cosa dovrei usare secondo te per far risvegliare il processo

Così il segnale è inviato e gestito e con il ciclo while (segnalep==0) funziona, però con la pause() niente...

Boh

:help: Puoi aiutarmi. Grazie

ilsensine
08-10-2007, 09:18
Puoi usare una esplicita kill(getpid(), SIGUSR1), ma ti consiglierei per motivi di portabilità di usare la pthread_kill:


pthread_t main_thread;

int main()
{
...
main_thread = pthread_self();
...
}

void altro_thread()
{
...
pthread_kill(main_thread, SIGUSR1);
...
}