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 05-12-2004, 13:33   #1
Ricky
Senior Member
 
Iscritto dal: Oct 1999
Città: Milano
Messaggi: 531
dubbi sul pause()...sotto unix

ragazzi non riesco a capire bene l utilizzo di questa funzione:quando metto un processo in pause, esso dovrebbe risvegliarsi alla ricezione di un segnale gestito da un apposita funzione ad esempio:


//da processo 1
...
signal(SIGUSR1,sveglio);
pause();
...

//da altro processo
...
kill(processo1,SIGUSR1);
...

//il sig_handler
...
void sveglio()
{
printf("mi sveglio\n");
return;
}

va bene cosi?dovrebbe ripartire il padre dove si era fermato? il fatto è che non sempre si sveglia...ad esempio, può succedere che quando va di nuovo in pausa nn si risveglia più!

c è qualcuno che può aiutarmi?
__________________
Vintage signature: Abit nf7-s, Xp 2500+@2300mhz, 256 mb 418mhz cas2, geforce fx5700,S-ATA 160 Maxtor,Lg gsa 4120b...prima..ma ora..DELL INSPIRON 6400, ATI X1300...
Ricky è offline   Rispondi citando il messaggio o parte di esso
Old 06-12-2004, 22:00   #2
Ricky
Senior Member
 
Iscritto dal: Oct 1999
Città: Milano
Messaggi: 531
UP!!
__________________
Vintage signature: Abit nf7-s, Xp 2500+@2300mhz, 256 mb 418mhz cas2, geforce fx5700,S-ATA 160 Maxtor,Lg gsa 4120b...prima..ma ora..DELL INSPIRON 6400, ATI X1300...
Ricky è offline   Rispondi citando il messaggio o parte di esso
Old 06-12-2004, 22:04   #3
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Posta un programmino completo e compilabile che consente di riprodurre il problema.
__________________
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 06-12-2004, 22:25   #4
Ricky
Senior Member
 
Iscritto dal: Oct 1999
Città: Milano
Messaggi: 531
http://forum.hwupgrade.it/showthread...hreadid=828647

una domandina facile facile...ma per fare ping pong tra due processi mi conviene usare i segnali? o meglio se faccio waitpid con un uso opportuno?
__________________
Vintage signature: Abit nf7-s, Xp 2500+@2300mhz, 256 mb 418mhz cas2, geforce fx5700,S-ATA 160 Maxtor,Lg gsa 4120b...prima..ma ora..DELL INSPIRON 6400, ATI X1300...
Ricky è offline   Rispondi citando il messaggio o parte di esso
Old 06-12-2004, 22:49   #5
Ricky
Senior Member
 
Iscritto dal: Oct 1999
Città: Milano
Messaggi: 531
per farla semplice non funziona neanche questo:

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>

void sveglio()
{
printf("sveglia\n");
// raise(SIGCONT);
}

int main(){
int figlio;


signal(SIGUSR1,sveglio);

printf(" proviamo i pause, se arrivo alla fine allora funge altrimenti uccidere con ctrl+c\n");
figlio=fork();
if (figlio==0){
pause();
kill(getppid(),SIGUSR1);
pause();
kill(getppid(),SIGUSR1);
pause();
exit(0);
}else{
sleep(1);

kill(figlio,SIGUSR1);
pause();
kill(figlio,SIGUSR1);
pause();
kill(figlio,SIGUSR1);
waitpid(figlio,NULL,NULL);
printf("finito\n");
}
}
__________________
Vintage signature: Abit nf7-s, Xp 2500+@2300mhz, 256 mb 418mhz cas2, geforce fx5700,S-ATA 160 Maxtor,Lg gsa 4120b...prima..ma ora..DELL INSPIRON 6400, ATI X1300...
Ricky è offline   Rispondi citando il messaggio o parte di esso
Old 07-12-2004, 07:42   #6
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Qui funziona, ma per pura fortuna.

Il programma è suscettibile di una ovvia race condition se avviene un context switch tra una kill() e la successiva pause(): in questa situazione, un processo esegue una kill mentre l'altro ancora non è nello stato di pause, rendendo la kill totalmente inefficace. Posso simulare la race inserendo una sched_yield() tra una kill e la pause successiva.
__________________
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 07-12-2004, 07:47   #7
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
In parole povere:
Codice:
p1			p2

pause
(switch su p2)
			kill
			(switch su p1??)
kill
pause
			pause
bye
Se questo capita, la race esplode. Dipende dallo scheduler se dopo le kill avviene il context switch o meno, sono liberi di decidere di farlo oppure no.
__________________
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 07-12-2004, 08:48   #8
Ricky
Senior Member
 
Iscritto dal: Oct 1999
Città: Milano
Messaggi: 531
in poche parole per far funzionare il ping pong fra i processi devo inserire degli sleep in modo tale da sincronizzare i due processi?...i
__________________
Vintage signature: Abit nf7-s, Xp 2500+@2300mhz, 256 mb 418mhz cas2, geforce fx5700,S-ATA 160 Maxtor,Lg gsa 4120b...prima..ma ora..DELL INSPIRON 6400, ATI X1300...
Ricky è offline   Rispondi citando il messaggio o parte di esso
Old 07-12-2004, 08:57   #9
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Il problema è concettuale, non tanto implementativo. Il tuo errore è eseguire la kill senza essere sicuro dello stato in cui si trova l'altro processo. Visto che l'esecuzione è totalmente asincrona, non puoi essere sicuro dello stato in alcun modo ovvio.
Se vuoi fare un semplice ping-pong, usa i messaggi (msgsnd/msgrcv).
__________________
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 07-12-2004, 10:11   #10
Ricky
Senior Member
 
Iscritto dal: Oct 1999
Città: Milano
Messaggi: 531
il problema è che questo esercizio è relativo alla parte di sistemi operativi mod a...quindi nello scritto nn posso usare nozioni di sistemi b...noi facciamo l IPC V solo al secondo modulo...
devo passare lo scritto di mod a ma nel frattempo sto seguendo il b all università....
perciò posso usare solo segnali, wait....capito?

ho provato ad usare delle sleep opportunamente messe e va tipo prima dei kill in modo tale che l altro processo vada in pause quando deve. E' sporco come metodo? considerando che i cambi di contesti avvengono sempre negli ordini di ms 1 secondo nella sleep è più che sufficiente non credi?

fammi sapere

ciao e grazie

P.S. scusa per il disturbo!!!
__________________
Vintage signature: Abit nf7-s, Xp 2500+@2300mhz, 256 mb 418mhz cas2, geforce fx5700,S-ATA 160 Maxtor,Lg gsa 4120b...prima..ma ora..DELL INSPIRON 6400, ATI X1300...
Ricky è offline   Rispondi citando il messaggio o parte di esso
Old 07-12-2004, 10:16   #11
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da Ricky
E' sporco come metodo?
E' più che sporco, è sbagliato per i motivi che ti ho detto.

Una soluzione più pulita (relativamente) può essere questa: imponi che, quando viene svegliato da kill, il processo invii un feedback a chi lo ha svegliato (ad es. tramite SIGUSR2). Se il feedback non arriva entro un certo timeout, ritenti il primo kill.
__________________
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 07-12-2004, 10:35   #12
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Qualcosa di questo tipo insomma: (negherò fino alla morte di aver scritto questa porcheria )
Codice:
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>

int killing;

void sveglio()
{
	printf("sveglia\n");
}

void ack()
{
	killing = 0;
}

void do_kill(pid_t pid)
{
	killing = 1;
	while(killing)
	{
		kill(pid, SIGUSR1);
// Se SIGUSR2 arriva durante usleep, questa si interrompe con EINTR
		if(killing)
			usleep(25000);
	}
}

int main(){
	int figlio;
	
	
		signal(SIGUSR1,sveglio);
		signal(SIGUSR2,ack);

	printf(" proviamo i pause, se arrivo alla fine allora funge altrimenti uccidere con ctrl+c\n");
	figlio=fork();
	if (figlio==0){
		pause();
		kill(getppid(), SIGUSR2);

		do_kill(getppid());
		pause();
		kill(getppid(), SIGUSR2);

		do_kill(getppid());
		pause();
		kill(getppid(), SIGUSR2);

		exit(0);
	}else{
		sleep(1);

		do_kill(figlio);
		pause();
		kill(figlio, SIGUSR2);

		do_kill(figlio);
		pause();
		kill(figlio, SIGUSR2);

		do_kill(figlio);
		waitpid(figlio,NULL,0);
		printf("finito\n");
	}
}
__________________
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 07-12-2004, 16:49   #13
Ricky
Senior Member
 
Iscritto dal: Oct 1999
Città: Milano
Messaggi: 531
secondo me la tua versione non è poi tanto diversa da quella con degli sleep opportunamente messi, in quanto a me gli sleep li fa sempre mentre a te solo nel caso in cui ti trovi a mandare il segnale prima che va in pause....giusto?
ti faccio vedere una mia versione funzionante anche se sporchissima!



Codice:
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>

void sveglio()
{
	printf("sveglia\n");
//	raise(SIGCONT);
}

int main(){
	int figlio;
	
	
	signal(SIGUSR1,sveglio);

	printf(" proviamo i pause, se arrivo alla fine allora funge altrimenti uccidere con ctrl+c\n");
	
        figlio=fork();
	if (figlio==0){					//temporalmente(Sequenze)
		pause();					/* 1 */
		sleep(1);					/* 3 */ //aspetto il padre(pause)	
		kill(getppid(),SIGUSR1);	   /* 4 */
		pause();					/* 5 */
		sleep(1);					/* 6 */
		kill(getppid(),SIGUSR1);			// e via dicendo
		pause();
		exit(0);
	}else{
		sleep(1);					
		
		kill(figlio,SIGUSR1);		        /* 2 */
		pause();					/* 3 */ //assicurato dallo sleep
		sleep(1);					/* 5 */
		kill(figlio,SIGUSR1);			/* 6 */
		pause();					
		sleep(1);
		kill(figlio,SIGUSR1);
		waitpid(figlio,NULL,NULL);
		printf("finito\n");
		exit(0);
	}
}
__________________
Vintage signature: Abit nf7-s, Xp 2500+@2300mhz, 256 mb 418mhz cas2, geforce fx5700,S-ATA 160 Maxtor,Lg gsa 4120b...prima..ma ora..DELL INSPIRON 6400, ATI X1300...

Ultima modifica di Ricky : 07-12-2004 alle 16:53.
Ricky è 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, ...
Oppo Find X10, X10 Pro Max e X10 E: conf...
Dal microscopio all'IA: un cervello di i...
Cyberpunk 2077 arriverà su Battle...
Altro che divieto: interi pallet di GeFo...
QNAPTS-h966TX, il NAS per chi fa editing...
Il trucco semplicissimo per installare W...
Apple rinvia due novità di iOS 27...
Una memoria ferroelettrica raggiunge 10 ...
Honor Magic 9, Pro Max e Super Edition: ...
24 offerte Amazon da non perdere, dalla ...
Apple starebbe progettando i propri cont...
Niente borsa per OpenAI prima del 2027: ...
Meta potrebbe aver mostrato in anticipo ...
Bicicletta elettrica L26 a 474,05€: e-bi...
NVIDIA RTX PRO 5500 Blackwell: 84 GB di ...
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: 13:09.


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