Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
WF-1000X M6 è la sesta generazione di auricolare in-ear sviluppata da Sony, un prodotto che punta a coniugare facilità di utilizzo con una elevata qualità di riproduzione dei contenuti audio e una cura nella riduzione del rumore ambientale che sia da riferimento
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake ha presentato diverse novità per la sua piattaforma legate all'intelligenza artificiale. Quella forse più eclatante è una collaborazione con OpenAI, ma non mancano diverse nuove funzionalità che rendono la piattaforma più flessibile e in grado di rispondere meglio alle esigenze in continuo cambiamento delle aziende
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Con velocità teoriche fino a 11 Gbps, gestione tramite app intelligente e protezione avanzata dei dispositivi, Roamii BE Pro porta il Wi‑Fi 7 tri‑band nelle abitazioni più esigenti. Un sistema Wi-Fi Mesh proposto da MSI allo scopo di garantire agli utenti una rete fluida e continua capace di sostenere streaming 8K, gaming competitivo e le applicazioni moderne più esigenti in termini di banda
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 01-04-2004, 23: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, 08: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, 09: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, 10: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, 10: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, 12: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, 13: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, 14: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, 14: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, 17: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


Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo M...
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Zscaler Threat Report 2026: l'adozione d...
Claude AI minaccia omicidi e ricatti qua...
Dentro la gara: a Milano Cortina 2026 i ...
Samsung Display presenta QD-OLED Penta T...
KONAMI torna con "Silent Hill: Town...
Rende il citofono smart a 44,99€: Ring I...
ThunderX3 XTC, la sedia da ufficio che s...
Mercy, Mission Impossible, Aronofsky: il...
Project Windless: il nuovo action in esc...
Saros: mostrato il gameplay del gioco de...
God of War: Sons of Sparta annunciato e ...
John Wick torna in un nuovo videogioco a...
MADE chiude il 2025 con 59 partner e 250...
007 First Light: allo State of Play un n...
Gli iPhone su Amazon costano meno che su...
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: 18:30.


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