Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 24-04-2004, 21:02   #1
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
[c/c++]Generare un processo e se non termina entro 5 secondi lo uccido

Salve,

quello che devo fare è la seguente cosa: devo eseguire un certo numero di computazioni; ognuna di queste deve essere eseguita in un processo separato. Un nuovo processo non puo essere creato prima che il precedente si sia concluso, e ogni processo deve concludersi ad esempio entro 5 secondi, se no lo si uccide e si passa a generare il successivo. Io ho fatto cosi:

- ho registrato una funzione handler per il segnale SIGALRM, che posso generare a mio piacimento, specificando dopo quanti secondi deve esserci il segnale.

- eseguo la fork, registrandomi il pid del processo creato; quindi chiamo la alarm(5) per generare l'allarme tra 5 secondi, dopodichè chiamo waitpid(pid, ...) per attendere la terminazione del processo. Se il processo non termina entro 5 secondi, scatta l'allarme, e la funzione handler esegue una kill(pid) per uccidere il processo che non è terminato.

Pero potrebbe esserci un inconveniente; supponiamo che debba generare 10 peocessi uno dopo l'altro; se imposto il codice in questo modo:

Codice:
for(int 1 = 0; i < 10; i++)
      pid = fork();
      alarm(5);
      if(pid == 0)
             break;
      wait(pid....);
potrebbe verificarsi che l'allarme dell'iterazione precedente venga a scattare proprio subito dopo la fork ma prima della nuova chiamata ad alarm(5): in questo modo il processo appena creato sarebbe ucciso senza che siano passati i 5 secondi. Allora potrei mettere alarm(5) prima della fork:

CODE]
for(int 1 = 0; i < 10; i++)
alarm(5);
pid = fork();
if(pid == 0)
break;
wait(pid....);
[/code]

In questo modo se un processo viene ucciso questo è per forza quello generato subito dopo la chiamata ad alarm() e non uno precedente (perche se il precedente non fosse terminato sarei ancora bloccato nella wait). Pero non posso avere la certezza che l'istruzione:

pid = fork();

venga conclusa entro 5 secondi: se cosi non avviene avrei che il segnale della precedente alarm() potrebbe essere generato quando il figlio ancora non è stato creato e quindi sarebbe sprecato, con la conseguenza che se non terminasse non saprei come ucciderlo perche il relativo allarme è gia avvenuto.

Sono giusti i miei ragionamenti? Potrei eliminare il problema della prima versione concludendo il cilco for con una chiamata alarm(0)?

Tra le due versioni penso che la seconda sia piu sicura, ma come posso impostare la cosa per avere l'assoluta certezza di quel che deve succedere? Ci sono funzioni alternative e piu specifiche che posso usare? C'è ad esempio una funzione che dato il pid mi dice se il processo relativo a quel pid e terminato o no?

Grazie, ciao.
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2004, 21:16   #2
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Ho trovato sulla documentazione a proposito di alarm(seconds):

If seconds is 0, a pending alarm request, if any, is cancelled.

Quindi se cancello la richiesta di allarme subito dopo la terminazione di un processo, un allarme dell'iterazuine precedente non dovrebbbe interferire con la successiva iterazione:

Codice:
for(int 1 = 0; i < 10; i++)
      pid = fork();
      alarm(5);
      if(pid == 0)
             break;
      wait(pid....);
      alarm(0);
Dite che va bene cosi? O ci sono dei dettagli che mi sfuggono?
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 25-04-2004, 15:17   #3
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Hai una piccola race condition tra la wait e la alarm(0), ma è assolutamente innocua. Va bene come hai fatto.
__________________
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
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 25-04-2004, 18:43   #4
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Quote:
Originariamente inviato da ilsensine
Hai una piccola race condition tra la wait e la alarm(0), ma è assolutamente innocua. Va bene come hai fatto.
Se hai tempo me la spieghi?

Se ti riferisci al fatto che potrebbe scattare l'allarme precedente dopo la wait ma prima del nuovo alarm(0), verrebbe eseguita la kill sul pid sul processo appena terminato, che mi sembra non dia problemi.
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals

Ultima modifica di anx721 : 25-04-2004 alle 19:20.
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 25-04-2004, 19:21   #5
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Se un processo termina regolarmente poco prima dei 5 secondi, la wait termina e viene eseguito successivamente alarm(0). Se tra la wait e la alarm scadono i 5 secondi, viene generato un SIGALRM dopo la wait (quindi a processo finito) ma prima della alarm(0). E' un evento a probabilità quasi nulla, ma possibile (e comunque assolutamente innocuo).
__________________
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
ilsensine è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
La prima missione orbitale del razzo spa...
Servizi in streaming sempre più c...
Anteprima della Leapmotor B03X: inizia l...
Anthropic accusa la Cina: Claude utilizz...
I satelliti Rassvet (Starlink russo) di ...
Un agente IA ha risolto un problema su W...
Cina: la CMSA potrebbe cambiare parte de...
68 mensilità di bonus per i dipen...
Rocket Lab ha fatto ricorso contro la de...
Nutanix rende disponibile Azure Virtual ...
Il padrino del deep learning avverte: gl...
Il finto avviso "iPhone Storage is Full"...
Dietrofront in Cina, addio touchscreen p...
Un piccolo accessorio trasforma lo smart...
Dopo 370 anni il Cyphral Distich non è p...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 03:56.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v