Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Dopo alcuni anni di assenza dai cataloghi dei suoi televisori, Hisense riporta sul mercato una proposta OLED che punta tutto sul rapporto qualità prezzo. Hisense 55A85N è un televisore completo e versatile che riesce a convincere anche senza raggiungere le vette di televisori di altra fascia (e altro prezzo)
Recensione Borderlands 4, tra divertimento e problemi tecnici
Recensione Borderlands 4, tra divertimento e problemi tecnici
Gearbox Software rilancia la saga con Borderlands 4, ora disponibile su PS5, Xbox Series X|S e PC. Tra le novità spiccano nuove abilità di movimento, un pianeta inedito da esplorare e una campagna che lascia al giocatore piena libertà di approccio
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale
NXTPAPER 60 Ultra è il primo smartphone con tecnologia NXTPAPER 4.0 per il display, un ampio IPS da 7,2 pollici. Con finitura anti-riflesso, processore MediaTek Dimensity 7400, fotocamera periscopica e modalità Max Ink per il detox digitale, NXTPAPER 60 Ultra punta a essere il riferimento tra gli smartphone pensati per il benessere degli occhi.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 01-04-2004, 22:42   #1
cn73
Senior Member
 
L'Avatar di cn73
 
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
Linux, C e semafori: dove sbaglio??

Olevo provare a risolvere il calssico problema di IPC del Produttore e Consumatore con buffer limitato (nel mio caso 4 elementi)...
Ho scritto questo codice, ma non funziona Dove sbaglio?? E' tutta la sera che ci sbatto la testa!

Codice:
#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/sem.h>

#define ARRAY_LENGTH 2
#define BUF_DIM 4


main() {

	int f;
	int in=0,out=0;
	int empty,full;
	char nextp,nextc;
	struct sembuf sops[ARRAY_LENGTH];
	int semid;

	//char buffer[10];
	//char *pun;

	semid = semget(IPC_PRIVATE,ARRAY_LENGTH,0666); //4 semafori nel set, r/w x tutti!
	printf("prelevato set di semafori id = %d\n",semid);

	empty = semctl(semid,0,SETVAL,BUF_DIM);
	full = semctl(semid,1,SETVAL,0);

	printf("Valore iniziale dei semafori:\n");
	printf("EMPTY: %d\n",semctl(semid,0,GETVAL,0));
	printf("FULL: %d\n",semctl(semid,1,GETVAL,0));


	f = fork();
	if (f == -1)
	{
	fprintf(stderr,"fork fallita\n");
	exit(1);
	}

	else if (f !=0) { //P
                 
		while (1){
			//nextp = 'x';
			printf("\n(P) -- wait(empty) -- tento di decrementare il semaforo EMPTY  %d\n",semctl(semid,0,GETVAL,0));
			//wait(empty) se il valore del sem EMPTY è 0 nn mi fa andare avanti!!
			sops[0].sem_num = 0; /* operazione sul semaforo 1 */
			sops[0].sem_op = -1; /* decrementa il semaforo di 1 */
			sops[0].sem_flg = 0; /* che fare: wait se == 0 */

			empty = semop(semid,sops,1); //1: lunghezza dell'array sops

			printf("\n(P) ho decrementato il semaforo EMPTY: %d\n", semctl(semid,0,GETVAL,0));
			//buffer[in]= nextp;
			system("sleep 10"); //P + lento di C
			printf("\n(P) ho prodotto l'elemento %d\n", in);


			in = (in +1) % BUF_DIM;
			
			printf("\n(P) -- signal(empty) -- tento di incrementare il semaforo FULL  %d\n",semctl(semid,1,GETVAL,0));
			//signal(full) incremento FULL
			sops[1].sem_num = 1; /* operazione sul semaforo 2 */
			sops[1].sem_op = 1; /* incrementa semaforo 2*/
			sops[1].sem_flg = 0; /* che fare: ??*/
			full = semop(semid,sops,1);
			printf("\n(P) - ho incrementato il semaforo FULL: %d\n" , semctl(semid,1,GETVAL,0));



		}
		exit(0);
		//semctl(semid,IPC_RMID,0);
		//printf("(P) Rilasciato i sem, ora muoio... \n");


	}
	else { //C

		while (1){

			printf("\n(C) -- wait(full) -- tento di decrementare il semaforo FULL: %d\n",semctl(semid,1,GETVAL,0));
			//wait(full)
			sops[1].sem_num = 1; /* operazione sul semaforo 0 */
			sops[1].sem_op =-1; /* decrementa il semaforo di 1 */
			sops[1].sem_flg = 0; /* che fare: wait se semaforo = 0 */

			full = semop(semid,sops,1); //1: lunghezza dell'array sops
			printf("\n(C) ho decrementato il semaforo FULL: %d\n" , semctl(semid,1,GETVAL,0));
			//nextc=buffer[out];
			system("sleep 1");
			printf("\n(C) ho consumato l'elemento %d\n", out);
			out = (out +1) % BUF_DIM;

			printf("\n(C) -- signal(empty) --  tento di incrementare il semaforo EMPTY - signal(EMPTY) %d\n" , semctl(semid,0,GETVAL,0));
			//signal(empty)
			sops[0].sem_num = 0; /* operazione sul semaforo 0 */
			sops[0].sem_op = 1; /* incrementa il semaforo di 1 */
			sops[0].sem_flg = 0; /* che fare: ?? */
			empty = semop(semid,sops,1);
			printf("\n(C) -ho incrementato il semaforo EMPTY - signal(EMPTY) %d\n" , semctl(semid,0,GETVAL,0));

		}
		
	}

}
cn73 è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2004, 07:52   #2
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Codice:
--- sem.c.org	2004-04-02 09:03:57.000000000 +0200
+++ sem.c	2004-04-02 09:03:31.000000000 +0200
@@ -62,7 +62,7 @@
                         sops[1].sem_num = 1; /* operazione sul semaforo 2 */
                         sops[1].sem_op = 1; /* incrementa semaforo 2*/
                         sops[1].sem_flg = 0; /* che fare: ??*/
-                        full = semop(semid,sops,1);
+                        full = semop(semid,sops+1,1);
                         printf("\n(P) - ho incrementato il semaforo FULL: %d\n" , semctl(semid,1,GETVAL,0));
 
 
@@ -84,7 +84,7 @@
                         sops[1].sem_op =-1; /* decrementa il semaforo di 1 */
                         sops[1].sem_flg = 0; /* che fare: wait se semaforo = 0 */
 
-                        full = semop(semid,sops,1); //1: lunghezza dell'array sops
+                        full = semop(semid,sops+1,1); //1: lunghezza dell'array sops
                         printf("\n(C) ho decrementato il semaforo FULL: %d\n" , semctl(semid,1,GETVAL,0));
                         //nextc=buffer[out];
                         system("sleep 1");
__________________
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 02-04-2004, 08:48   #3
cn73
Senior Member
 
L'Avatar di cn73
 
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
Per cortesia fammi capire...

intendi togliere per il semaforo FULL

- full = semop(semid,sops,1);

e sostituirlo con

+ full = semop(semid,sops+1,1); ??


Io avevo capito questo:

Quote:
La chiamata semop() consente di specificare una lista (sops[]) di
(nsops) operazioni:
int semop ( int semid, struct sembuf *sops, unsigned nsops );

Un esempio di chiamata e':
semop ( sid, sops, 1);
la quale indica che si fa una operazione, la quale e' specificata
nella lista sops[].
quel parametro nsops pensavo fosse l'offset all'inerno dell'array a partrire da sops...
cn73 è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2004, 09:06   #4
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da cn73
Per cortesia fammi capire...

intendi togliere per il semaforo FULL

- full = semop(semid,sops,1);

e sostituirlo con

+ full = semop(semid,sops+1,1); ??


Io avevo capito questo:

man diff

Quote:
quel parametro nsops pensavo fosse l'offset all'inerno dell'array a partrire da sops...
Puoi specificare in un array _più_ operazioni da compiere anche su _più_ semafori in maniera _atomica_.
Nel tuo caso compi una unica operazione su un unico semaforo alla volta, quindi potevi anche non usare un array.
__________________
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 02-04-2004, 09:44   #5
cn73
Senior Member
 
L'Avatar di cn73
 
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
full = semop(semid,sops+1,1);


sops +1 è l'indirizzo dell'elemento dell'array che contiene il semaforo sul quale voglio aplllicare l'operazione?

il terzo parametro (nops =1) che cavolo indica? Che voglio eseguire una sola operazione atomica su quel array di semafori?
cn73 è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2004, 11:23   #6
cn73
Senior Member
 
L'Avatar di cn73
 
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
Per non riscrivere sempre il codice dei semafori è corretto implementare due funzioni P e V in questo modo?

Codice:
P(struct sembuf sems[ARRAY_LENGTH], int index, int semid){
		sems[index].sem_num = index; /* operazione sul semaforo 0 */
		sems[index].sem_op = -1; /* incrementa il semaforo di 1 */
		sems[index].sem_flg = 0; /* che fare: ?? */	
		
		return semop(semid,sems + index,1); 
}	

V(struct sembuf sems[ARRAY_LENGTH], int index, int semid){
		sems[index].sem_num = index; /* operazione sul semaforo 0 */
		sems[index].sem_op = +1; /* incrementa il semaforo di 1 */
		sems[index].sem_flg = 0; /* che fare: ?? */	
		
		return semop(semid,sems + index,1); 
}
cn73 è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2004, 12:00   #7
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Ti stai solo complicando la vita...

struct sembuf s;
s.sem_flg = 0;

s.sem_op = -1;
s.sem_num = 0;
semop(semid, &s, 1);

s.sem_op = 1;
s.sem_num = 1;
semop(semid, &s, 1);
__________________
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 02-04-2004, 13:33   #8
cn73
Senior Member
 
L'Avatar di cn73
 
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
Allora diciamo che un array di semafori è utile quando si devono eseguire operazioni unuitarie contemporaneamente su + semafori.Se devo eseguire una sola operazion alla volta su n semafori conviene definire 2 diversi semafori:


struct sembuf s1;
struct sembuf s2;

E' corretto?
cn73 è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2004, 13:58   #9
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Se le operazioni non vengono effettuate in contemporanea (ad es. da due thread) puoi anche usare una unica struct sembuf
__________________
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 02-04-2004, 16:14   #10
cn73
Senior Member
 
L'Avatar di cn73
 
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
Ho capito!


struct sembuf sops;

...
prelevo n semafori
semid = semget(IPC_PRIVATE,n,0666);

e poi uso P(i) e V(i) dove

Codice:
P(int sem ){
		sops.sem_num = sem; /* operazione sul semaforo 0 */
		sops.sem_op = -1; /* incrementa il semaforo di 1 */
		sops.sem_flg = 0; /* che fare: ?? */	
		
		return semop(semid,sops,1); 
}	

V(int sem){
		sops.sem_num = sem; /* operazione sul semaforo 0 */
		sops.sem_op = +1; /* incrementa il semaforo di 1 */
		sops.sem_flg = 0; /* che fare: ?? */	
		
		return semop(semid,sops ,1); 
}
cn73 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti Hisense A85N: il ritorno all’OLED è convi...
Recensione Borderlands 4, tra divertimento e problemi tecnici Recensione Borderlands 4, tra divertimento e pro...
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale TCL NXTPAPER 60 Ultra: lo smartphone che trasfor...
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming Un fulmine sulla scrivania, Corsair Sabre v2 Pro...
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni Nokia Innovation Day 2025: l’Europa ha bisogno d...
L'equipaggio della missione Shenzhou-20 ...
Possibili detriti spaziali del razzo cin...
Amazon distrugge i prezzi: TV OLED LG, i...
Trump studia dazi fino al 100% per sping...
ASUS Vivobook Go 15 in offerta su Amazon...
Occhio a questi Mini PC e tablet in offe...
La navicella Dragon di SpaceX ha modific...
Il Gruppo Volkswagen taglia la produzion...
Amazon sconta gli spazzolini Oral-B iO: ...
Metal Gear Solid: nuova Collection in ar...
Amazon lancia i pareggi NO IVA: maxi sco...
DAZN lancia una nuova promo per ex clien...
iPhone 17 supera il test di resistenza d...
Electronic Arts presto acquisita per 50 ...
Sierra Space: lo spazioplano Dream Chase...
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:55.


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