|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Oct 2007
Messaggi: 7
|
[C] ADDORMENTARE E SVEGLIARE UN PROCESSO
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; } Ultima modifica di eaangi77 : 04-10-2007 alle 01:29. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
kill(pid, 0) controlla solo che il processo esista, non invia nessun segnale.
__________________
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: Apr 2000
Città: Roma
Messaggi: 15625
|
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(), ...).
__________________
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 Ultima modifica di ilsensine : 04-10-2007 alle 12:07. |
|
|
|
|
|
#4 |
|
Junior Member
Iscritto dal: Oct 2007
Messaggi: 7
|
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 Puoi aiutarmi. Grazie
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Puoi usare una esplicita kill(getpid(), SIGUSR1), ma ti consiglierei per motivi di portabilità di usare la pthread_kill:
Codice:
pthread_t main_thread;
int main()
{
...
main_thread = pthread_self();
...
}
void altro_thread()
{
...
pthread_kill(main_thread, SIGUSR1);
...
}
__________________
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: 15:43.











Puoi aiutarmi. Grazie








