Torna indietro   Hardware Upgrade Forum > Software > Programmazione

iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
C'è tanta sostanza nel nuovo smartphone della Mela dedicato ai creator digitali. Nuovo telaio in alluminio, sistema di raffreddamento vapor chamber e tre fotocamere da 48 megapixel: non è un semplice smartphone, ma uno studio di produzione digitale on-the-go
Intel Panther Lake: i processori per i notebook del 2026
Intel Panther Lake: i processori per i notebook del 2026
Panther Lake è il nome in codice della prossima generazione di processori Intel Core Ultra, che vedremo al debutto da inizio 2026 nei notebook e nei sistemi desktop più compatti. Nuovi core, nuove GPU e soprattutto una struttura a tile che vede per la prima volta l'utilizzo della tecnologia produttiva Intel 18A: tanta potenza in più, ma senza perdere in efficienza
Intel Xeon 6+: è tempo di Clearwater Forest
Intel Xeon 6+: è tempo di Clearwater Forest
Intel ha annunciato la prossima generazione di processori Xeon dotati di E-Core, quelli per la massima efficienza energetica e densità di elaborazione. Grazie al processo produttivo Intel 18A, i core passano a un massimo di 288 per ogni socket, con aumento della potenza di calcolo e dell'efficienza complessiva.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-10-2002, 11:34   #21
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Ok come mi avevi scritto...e come fai a scrivere nella posizione che gli compete? Infatti io lo so fare per le stringhe statiche e non quelle con puntatore. Per farla breve: io so che per le stringhe statiche uso strncpy(&str[4],token,strlen(token)); pero' non si puo' fare lo stesso se hai un puntatore ad una stringa, era quello che cercavo di chiedere.
Chi ha detto che non si può fare?

char a[64] = "salaam";
char *b = (char *) malloc(1024);
memcpy(&b[4], &a[1], 2);

nb1 al posto di &foo[x] puoi usare direttamente foo+x. Questo vale sia per stringhe statiche che allocate dinamicamente.
nb2 una stringa statica _è_ un puntatore char *, con l'unica differenza che non può cambiare il suo valore.
__________________
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 22-10-2002, 10:51   #22
Cimmo
Senior Member
 
L'Avatar di Cimmo
 
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
Quote:
Originariamente inviato da ilsensine
[b]
Chi ha detto che non si può fare?
Infatti chi l'ha detto? Fuori i nomi...
Hai proprio ragione si usano tale e quale prima...
Adesso mi butto sui semafori...attenti alle pressime domande...
Cimmo è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2002, 11:49   #23
Cimmo
Senior Member
 
L'Avatar di Cimmo
 
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
Quote:
Originariamente inviato da ilsensine
[b]Ci sono i pthread_mutex, ma sono utilizzabili solo tra più thread. Non credo che mettendo uno di questi mutex nella memoria condivisa, e accedendoci da diversi processi, l'atomicità delle operazioni di lock sia assicurata.
Con i semafori comunque ottieni lo stesso risultato:

pthread_mutex_init <-> cmd.val=1; semctl(id, 0, SETVAL, cmd)
pthread_mutex_lock <-> buf.sem_op=-1; semop(id, &buf, 1)
pthread_mutex_unlock <-> buf.sem_op=1; semop(id, &buf, 1)
Quando compilo con i semafori mi dice:
host.c: In function `main':
host.c:89: storage size of `cmd' isn't known
host.c:89: warning: unused variable `cmd'

strano perche' invece cmd e' usato...

Altra cosa: se io ho bisogno di un'altra variabile condivisa: mi basta ripetere la shmget, posso farlo con le stesse variabili, tanto dopo che ho fatto la shmat il valore id restituito da shmget non mi serve piu'...giusto?
Pero' altra domanda: il valore di _SHM_MAGIC__ per cosa sta? Posso usarlo anche per la creazione della seconda variabile condivisa?

ciao
Cimmo è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2002, 11:52   #24
Cimmo
Senior Member
 
L'Avatar di Cimmo
 
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
Quote:
Originariamente inviato da Cimmo
[b]
Quando compilo con i semafori mi dice:
host.c: In function `main':
host.c:89: storage size of `cmd' isn't known
host.c:89: warning: unused variable `cmd'

strano perche' invece cmd e' usato...
A questa mi sono risposto da solo: non avevo messo la union iniziale...le altre domande pero' sono ancora valide
Cimmo è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2002, 12:11   #25
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Altra cosa: se io ho bisogno di un'altra variabile condivisa: mi basta ripetere la shmget, posso farlo con le stesse variabili, tanto dopo che ho fatto la shmat il valore id restituito da shmget non mi serve piu'...giusto?
Se intendi creare un altro segmento condiviso, devi ripetere la shmget/shmat con un valore MAGIC differente. Ti consiglio però di utilizzare lo stesso segmento creato in precedenza, allocando spazio anche per le altre variabili (ovviamente devi stare attento alla loro posizione).

Quote:
Pero' altra domanda: il valore di _SHM_MAGIC__ per cosa sta? Posso usarlo anche per la creazione della seconda variabile condivisa?
E' un identificativo per il tuo segmento condiviso; deve essere unico per tutto il sistema, e deve essere diverso per tutti i segmenti condivisi. In sostanza è il "nome" della regione condivisa.
Puoi vedere i segmenti allocati (e il relativo valore MAGIC, indicato in decimale con key) nel file /proc/sysvipc/shm (nella stessa directory trovi un file anche per i semafori).
__________________
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 22-10-2002, 12:50   #26
Cimmo
Senior Member
 
L'Avatar di Cimmo
 
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
Quote:
Originariamente inviato da ilsensine
[b]
Se intendi creare un altro segmento condiviso, devi ripetere la shmget/shmat con un valore MAGIC differente. Ti consiglio però di utilizzare lo stesso segmento creato in precedenza, allocando spazio anche per le altre variabili (ovviamente devi stare attento alla loro posizione).
Ok nalla variabile dim ci metto spazio per tutto quello che voglio allocare.
Poi come chiamo le 2 shmat? Visto che dovra' darmi fuori 2 valori id uno per la prima variabile, uno per la seconda...
Quote:
[b]
E' un identificativo per il tuo segmento condiviso; deve essere unico per tutto il sistema, e deve essere diverso per tutti i segmenti condivisi. In sostanza è il "nome" della regione condivisa.
Puoi vedere i segmenti allocati (e il relativo valore MAGIC, indicato in decimale con key) nel file /proc/sysvipc/shm (nella stessa directory trovi un file anche per i semafori).
Ma la memoria condivisa si dealloca alla chiusura del programma o la devo deallocare io?
Cimmo è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2002, 13:06   #27
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da Cimmo [/i]
[b]
Ok nalla variabile dim ci metto spazio per tutto quello che voglio allocare.
Poi come chiamo le 2 shmat? Visto che dovra' darmi fuori 2 valori id uno per la prima variabile, uno per la seconda...
No, il segmento è unico. Sei tu che devi gestire la posizione degli elementi. Ad es. supponi di voler mettere anche un intero:
Codice:
dim = MAX_DIM_STRINGA+sizeof(int);
id = shmget(...);
void *mem = shmat(id, ...);
char *spos = (char *) mem;
int *val = (int *) (spos+MAX_DIM_STRINGA);
(nb questo procedimento non funziona con gli sparc)
Quote:
Ma la memoria condivisa si dealloca alla chiusura del programma o la devo deallocare io?
La memoria sopravvive all'uscita del programma, e se hai provato l'esempio che ho postato sulla shm capirai perchè.
Puoi renderlo "autodistruggente" quando il conteggio degli accessi è 0 usando il comando IPC_RMID con la shmctl (v. man).
__________________
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 22-10-2002, 16:38   #28
Cimmo
Senior Member
 
L'Avatar di Cimmo
 
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
Quote:
Originariamente inviato da ilsensine
[b]
No, il segmento è unico. Sei tu che devi gestire la posizione degli elementi. Ad es. supponi di voler mettere anche un intero:
Fammi capire una cosa: quindi se faccio partire il programma 5 volte contemporaneamente lui becca sempre la stessa area di memoria?
Cio' non e' accettabile...praticamente e' cosi'...ogni istanza del mio software genera figli e tutti i figli e il padre condividono un paio di variabili...pero' tra diverse istanze del programma le variabili devono essere diverse...come faccio?
E se moltiplicassi il numero magico per il process id? Brutta idea?
Cimmo è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2002, 16:47   #29
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da Cimmo
[b]E se moltiplicassi il numero magico per il process id? Brutta idea?
No...anzi dovrebbe essere giusta come idea...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2002, 16:50   #30
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Puoi:
1) usare un MAGIC diverso per ogni chiamata (sta a te decidere come generarlo, casualmente o per altre vie)
2) usare, al posto di MAGIC, il valore IPC_PRIVATE e passare in qualche modo l'id restituito da shmget ai child
__________________
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 22-10-2002, 16:51   #31
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
E se moltiplicassi il numero magico per il process id? Brutta idea?
...allora usa direttamente il pid
__________________
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 23-10-2002, 10:04   #32
Cimmo
Senior Member
 
L'Avatar di Cimmo
 
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
Ancora qualche dubbio:
1) il discorso dell'unicita' della memoria condivisa se si usa sempre lo stesso numero magico vale anche per i semafori? Cioe' il semaforo e' lo stesso se diverse istanze del programma usano lo stesso magic number?

2) se voglio mettere un secondo semaforo devo istanziare altre 2 variabili cmd e buf?

grazie
Cimmo
Cimmo è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2002, 10:17   #33
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da Cimmo
Ancora qualche dubbio:
1) il discorso dell'unicita' della memoria condivisa se si usa sempre lo stesso numero magico vale anche per i semafori? Cioe' il semaforo e' lo stesso se diverse istanze del programma usano lo stesso magic number?
Certo, altrimenti non funziona nulla. Ricorda che puoi anche usare IPC_PRIVATE.

Quote:
2) se voglio mettere un secondo semaforo devo istanziare altre 2 variabili cmd e buf?
Sono semplicemente variabili di appoggio; puoi riutilizzarle, se vuoi, oppure crearne altre.
__________________
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 23-10-2002, 10:26   #34
Cimmo
Senior Member
 
L'Avatar di Cimmo
 
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
Quote:
Originariamente inviato da ilsensine
[b]
Certo, altrimenti non funziona nulla. Ricorda che puoi anche usare IPC_PRIVATE.


Sono semplicemente variabili di appoggio; puoi riutilizzarle, se vuoi, oppure crearne altre.
Quindi posso fare cosi':
Codice:
id1=semget(__SEM_MAGIC__*getpid()*1, 1, IPC_CREAT|0660);
if (id1<0) fail("semget");
id2=semget(__SEM_MAGIC__*getpid()*2, 1, IPC_CREAT|0660);
if (id2<0) fail("semget");
cmd1.val=1;
cmd2.val=1;
if (semctl(id1, 0, SETVAL, cmd1)<0) fail("semctl");
if (semctl(id2, 0, SETVAL, cmd2)<0) fail("semctl");
buf1.sem_num=0;
buf1.sem_flg=SEM_UNDO;
buf2.sem_num=0;
buf2.sem_flg=SEM_UNDO;
Alla fine ho pensato che dovendo usare contemporaneamente i 2 semafori non posso usare le stesse variabili.
Come sem magic ho messo la costante per il process id (cosi' si differenzia da istanza a istanza) e moltiplicato x 1 e x 2 per differenziare i 2 semafori...

e' tutto ok?
Cimmo è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2002, 10:43   #35
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Non farei assolutamente così.
Ricorda che con semget puoi allocare un array di semafori (v. man).
E non usare __SEM__MAGIC__*getpid()*x, meglio usare solo getpid() se ti basta un'unica allocazione, oppure IPC_PRIVATE e passare l'id restituito ai child (anzi, forse è la scelta migliore).
__________________
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 23-10-2002, 11:21   #36
Cimmo
Senior Member
 
L'Avatar di Cimmo
 
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
Quote:
Originariamente inviato da ilsensine
[b]Non farei assolutamente così.
Ricorda che con semget puoi allocare un array di semafori (v. man).
E non usare __SEM__MAGIC__*getpid()*x, meglio usare solo getpid() se ti basta un'unica allocazione, oppure IPC_PRIVATE e passare l'id restituito ai child (anzi, forse è la scelta migliore).
Ecco un array di semafori e' quello che fa per me...
va bene se la istanzio cosi':
Codice:
idsem=semget(getpid(), NUMSEM, IPC_CREAT|0660);
if (idsem<0) fail("semget");
cmd.val=1;
if (semctl(idsem, NUMSEM, SETVAL, cmd)<0) fail("semctl");
buf.sem_num=0;
buf.sem_flg=SEM_UNDO;
e poi quando richiamo un semaforo per dirgli quello che voglio usare devo modificare il campo buf.sem_num?
Nel senso voglio chiedere la mutua esclusione del 20esimo semafaro va bene se faccio:
Codice:
buf.sem_num=19;
buf.sem_op=(-1);
if (semop(idsem, &buf, 1)<0) fail("semop");
Cimmo è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2002, 11:24   #37
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Codice:
idsem=semget(getpid(), NUMSEM, IPC_CREAT|0660);
if (idsem<0) fail("semget");
cmd.val=1;
[B]for(int x=0; x<NUMSEM; ++x)
    if (semctl(id, x, SETVAL, cmd)<0) fail("semctl");[/B]
buf.sem_num=0;
buf.sem_flg=SEM_UNDO;
Quote:
e poi quando richiamo un semaforo per dirgli quello che voglio usare devo modificare il campo buf.sem_num?
Esatto
__________________
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 23-10-2002, 11:26   #38
Cimmo
Senior Member
 
L'Avatar di Cimmo
 
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
Forse volevi scrivere cosi'? Non avrebbe senso il for senno'...
for(int x=0; x<NUMSEM; ++x) {
if (semctl(id, x, SETVAL, cmd)<0) fail("semctl");
}
Cimmo è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2002, 11:27   #39
Cimmo
Senior Member
 
L'Avatar di Cimmo
 
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
Ok hai appena editato e modificato...ma perche' il ++x? Cosi' il primo valore sara' 1...non capisco...
Cimmo è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2002, 11:43   #40
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da Cimmo
[b]Ok hai appena editato e modificato...ma perche' il ++x? Cosi' il primo valore sara' 1...non capisco...
...sicuro?
__________________
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


iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Intel Xeon 6+: è tempo di Clearwater Forest Intel Xeon 6+: è tempo di Clearwater Fore...
4K a 160Hz o Full HD a 320Hz? Titan Army P2712V, a un prezzo molto basso 4K a 160Hz o Full HD a 320Hz? Titan Army P2712V,...
Recensione Google Pixel Watch 4: basta sollevarlo e si ha Gemini sempre al polso Recensione Google Pixel Watch 4: basta sollevarl...
Samsung è sempre più prota...
ChatGPT ha pregiudizi politici? Ecco cos...
Un solo iPhone rubato ha portato alla sc...
Xiaomi 17 Ultra sta arrivando: ecco come...
Il Motorola Edge 70 non ha più se...
Alcuni Galaxy S26 utilizzeranno il chip ...
Amazon, ecco i super sconti del weekend:...
Scovare un bug di sicurezza sui disposit...
Offerta Amazon su NordVPN: proteggi 10 d...
ECOVACS DEEBOT X8 PRO OMNI in offerta su...
Scope elettriche Tineco in offerta su Am...
Offerta Amazon sui robot EUREKA J15 Ultr...
Chrome disattiverà automaticament...
Tornano tutti e 4 i colori disponibili p...
Super sconto su iPhone 16: Amazon abbass...
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: 04:27.


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