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 16-10-2002, 10:59   #1
Cimmo
Senior Member
 
L'Avatar di Cimmo
 
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
Alcune domandine semplici sul C

1) Come faccio a specificare una variabile condivisa tra un processo e tutti i suoi figli futuri? Nel senso che il primo che modifica sta variabile, tale modifica deve essere visibile a tutti.

2) Visto che questo porta problemi di concorrenza: come si usano i semafori in C? C'e' (spero) una funzione che ti garantisce la mutuaesclusione nell'accesso a tale variabile rispetto a tutti i figli?

3) Esiste (qualcuno l'ha creata) una funzione che data una stringa ad ogni occorrenza di una sotto-stringa te la sostituisce con un'altra sotto-stringa? Del tipo: ogni "/" te lo sostituisce con un "?/"

grazie in anticipo

ciao
Cimmo
Cimmo è offline   Rispondi citando il messaggio o parte di esso
Old 16-10-2002, 13:09   #2
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Parli di sistemi unix?
__________________
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 16-10-2002, 17:04   #3
Cimmo
Senior Member
 
L'Avatar di Cimmo
 
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
Si perche' cambia?
Cimmo è offline   Rispondi citando il messaggio o parte di esso
Old 16-10-2002, 17:57   #4
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Certo.
Sotto i sistemi unix (in particolare linux) puoi ottenere memoria condivisa tramite shmget (v. pagina man); in sostanza, chiedi un'area di memoria di una certa dimensione, assegnandole una chiave. Qualsiasi altra applicazione che chiede memoria con la stessa chiave ottiene (permessi permettendo) la stessa area. Analogamente puoi ottenere un semaforo con semget (la pagina man indica anche le altre funzioni relative ai semafori); il principio della "chiave" unica è sempre lo stesso.
La shm va bene se devi spostare grandi quantità di dati o per accessi frequenti in lettura; altrimenti puoi usare delle valide alternative (come pipe, file mappati in tmpfs, socket ecc.).
__________________
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 16-10-2002, 18:05   #5
Cimmo
Senior Member
 
L'Avatar di Cimmo
 
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
Quindi shmget e semget...ok e la terza domanda ne sai qualcosa?
Altra cosa che centra piu' sulla Mandrake 9.0

a) Perche' non c'e' il man di niente (fork, strcmp, tutto manca)? E dire che durante l'installazione ho scelto tutte le categorie...che pacchetto mi manca?

b) E' sparito il pacchetto linuxlogo? Se si' lo posso ripescare da qualche parte?

grazie

ciao
Cimmo
Cimmo è offline   Rispondi citando il messaggio o parte di esso
Old 16-10-2002, 20:23   #6
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
a) Perche' non c'e' il man di niente (fork, strcmp, tutto manca)? E dire che durante l'installazione ho scelto tutte le categorie...che pacchetto mi manca?
Bella, questa.
Il pacchetto dovrebbe essere man-pages, però è assurdo che non sia installato...vabbè nella mdk 9 ne hanno combinate un pò di tutti i colori

Quote:
b) E' sparito il pacchetto linuxlogo? Se si' lo posso ripescare da qualche parte?
Mai usato...
__________________
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 16-10-2002, 22:13   #7
Cimmo
Senior Member
 
L'Avatar di Cimmo
 
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
Quote:
Originariamente inviato da ilsensine
[b]
Bella, questa.
Il pacchetto dovrebbe essere man-pages, però è assurdo che non sia installato...vabbè nella mdk 9 ne hanno combinate un pò di tutti i colori
Il pacchetto man-pages e' installato, cosi' come l'how-to e la documentazione. Pero' se faccio per esempio man shmget e man semget mi dice sempre no manual entry!
Se faccio man man invece funziona!
Cimmo è offline   Rispondi citando il messaggio o parte di esso
Old 17-10-2002, 08:04   #8
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Puoi vedere se sotto /usr/share/man/man2 è presente shmget.2.bz2?
__________________
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 17-10-2002, 11:19   #9
Cimmo
Senior Member
 
L'Avatar di Cimmo
 
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
Quote:
devo allocare della memoria condivisa tra diversi processi, per la precisione deve essere un stringa di MAXSIZE elementi, io l'ho fatto cosi':
int i=shmget(0,sizeof(char[MAXSIZE]),IPC_CREAT);
No; prova questo programma, eseguendolo più volte di seguito:
Codice:
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

#define __SHM_MAGIC__ 0x265170a1

#define fail(who) do { perror(who); exit(-1); } while(0)

int main() {
int id;
void *mem;

id = shmget(__SHM_MAGIC__, getpagesize(), IPC_CREAT|0660);
if(id<0) fail("shmget");
mem = shmat(id, NULL, 0);
if(!mem) fail("shmat");
printf("Segmento 0x%08x mappato su %p\n", id, mem);
printf("Primo intero: %d\n", (*(int*)mem)++);
printf("Nuovo valore: %d\n", *(int*)mem);
return 0;
}
Quote:
Poi analogamente ho creato un semaforo cosi':
int i=semget(0,1,IPC_CREAT);
dopo come lo uso per la mutuaesclusione?
Devo darci un'occiata
Cimmo è offline   Rispondi citando il messaggio o parte di esso
Old 17-10-2002, 12:00   #10
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Ahhh per sbaglio invece di inserire una risposta ho "modificato" il tuo messaggio
La vecchiaia...comunque è il caso di dire che...ti sei risposto da solo
__________________
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 17-10-2002, 12:05   #11
Cimmo
Senior Member
 
L'Avatar di Cimmo
 
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
Quote:
Originariamente inviato da ilsensine
[b]Ahhh per sbaglio invece di inserire una risposta ho "modificato" il tuo messaggio
La vecchiaia...comunque è il caso di dire che...ti sei risposto da solo
Questi privilegi da moderatore...
non fa niente...adesso provero'...e spero di capirci qualcosa! Se ti viene qualcosa anche sui semafori ben venga...

ciao
Cimmo
Cimmo è offline   Rispondi citando il messaggio o parte di esso
Old 17-10-2002, 12:38   #12
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
I semafori sono un pò più complicati dei mutex; guarda man semop/semctl. Prova inoltre questo esempio:
Codice:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

#define __SEM_MAGIC__ 0x7688912a
#define fail(who) do { perror(who); exit(-1); } while(0)

union semun {
  int val;
  struct semid_ds *buf;
  unsigned short *array;
  struct seminfo *__buf; 
};

int main() {
struct sembuf buf;
union semun cmd;
int id;
id = semget(__SEM_MAGIC__, 1, IPC_CREAT|0660);
if(id<0) fail("semget");
fprintf(stderr, "Creato il set di semafori 0x%08x\n", id);

/* Inizializza il semaforo, settando semval a 1 */
cmd.val = 1;
if(semctl(id, 0, SETVAL, cmd)<0) fail("semctl");

buf.sem_num = 0;
buf.sem_flg = SEM_UNDO; /* |IPC_NOWAIT per la forma non bloccante */

fork();

fprintf(stderr, "%d: Provo a bloccare il semaforo...\n", getpid());
buf.sem_op = -1;
if(semop(id, &buf, 1)<0) fail("semop"); /* Fallisce con EAGAIN se è specificato IPC_NOWAIT */

fprintf(stderr, "%d: Semaforo bloccato\n", getpid());
sleep(2); /* Aspetto un pò...*/

buf.sem_op = 1;
if(semop(id, &buf, 1)<0) fail("semop");
fprintf(stderr, "%d: Semaforo ripristinato\n", getpid());
return 0;
}
__________________
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 17-10-2002, 12:43   #13
Cimmo
Senior Member
 
L'Avatar di Cimmo
 
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
Alla fine a me serve un semaforo unico, nel senso che mi basterebbe un flag a cui accederci in mutua esclusione...non ho bisogno proprio di un semfaro che per definizione permette n accessi ad una risorsa condivisa (con 0<=n<=MAXRESOURCE)...quindi se esiste in C sotto Unix qualcosa di piu' semplice ancora meglio...illuminami di sapienza!
Cimmo è offline   Rispondi citando il messaggio o parte di esso
Old 17-10-2002, 13:29   #14
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
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)
__________________
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 21-10-2002, 10:49   #15
Cimmo
Senior Member
 
L'Avatar di Cimmo
 
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
Per ora sto provando la shared memory, il problema e' che io ho bisogno di una stringa e lui mi da' un puntatore ad un'area di memoria che puo' essere qualsiasi cosa mi sembra aver capito (la dimensione di questa area pero' mi e' sconosciuta).
Io prima avevo una stringa statica:
char str[100];

se volevo scrivere nella 5 posizione facevo:

strncpy(&str[4],token,strlen(token));

adesso con un puntatore ad una stringa come cavolo faccio a ricavare l'indirizzo della posizione dalla quale partire a copiare l'altra sottostringa?
Cimmo è offline   Rispondi citando il messaggio o parte di esso
Old 21-10-2002, 10:59   #16
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Devi copiare l'intera stringa nella shm, in quanto un processo non può accedere alla memoria di un altro processo. Tutte le gestioni sulle dimensioni ecc. le devi fare manualmente.
Quote:
(la dimensione di questa area pero' mi e' sconosciuta)
La dimensione è un multiplo di getpagesize() bytes (sugli x86 vale 4096 byte).
E' memoria grezza, come quella allocata con malloc.
__________________
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 21-10-2002, 11:11   #17
Cimmo
Senior Member
 
L'Avatar di Cimmo
 
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
Quote:
Originariamente inviato da ilsensine
[b]Devi copiare l'intera stringa nella shm, in quanto un processo non può accedere alla memoria di un altro processo. Tutte le gestioni sulle dimensioni ecc. le devi fare manualmente.
Si questo l'ho capito, pero' io vorrei che ogni processo scrivi direttamente nella shared memory e possa scrivere solo un pezzo di stringa magari dalla posizione 4 alla 7. Questo perche' ogni processo ha solo dei pezzi di stringa e non tutta. Come faccio?

Quote:
[b]
La dimensione è un multiplo di getpagesize() bytes (sugli x86 vale 4096 byte).
E' memoria grezza, come quella allocata con malloc.
Si ma che multiplo? Posso deciderlo io? A me serve una quantita' necessaria per metterci una stringa di SIZE dimensioni.

Thanx
Cimmo è offline   Rispondi citando il messaggio o parte di esso
Old 21-10-2002, 11:17   #18
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Si questo l'ho capito, pero' io vorrei che ogni processo scrivi direttamente nella shared memory e possa scrivere solo un pezzo di stringa magari dalla posizione 4 alla 7. Questo perche' ogni processo ha solo dei pezzi di stringa e non tutta. Come faccio?
char *mem;
mem = (char *) shmat(id, NULL, 0);
...e tratti mem come la tua stringa, e ognuno scrive nella posizione che gli compete.


Quote:
Si ma che multiplo? Posso deciderlo io? A me serve una quantita' necessaria per metterci una stringa di SIZE dimensioni.
int dim = <dimensione richiesta>;
dim = (dim+getpagesize()-1) & ~(getpagesize()-1);
id = shmget(__SHM_MAGIC__, dim, IPC_CREAT|0660);

Così "dim" è un multipo di pagina, e contiene almeno la dimensione che hai richiesto.
__________________
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 21-10-2002, 11:25   #19
Cimmo
Senior Member
 
L'Avatar di Cimmo
 
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
Quote:
Originariamente inviato da ilsensine
[b]
char *mem;
mem = (char *) shmat(id, NULL, 0);
...e tratti mem come la tua stringa, e ognuno scrive nella posizione che gli compete.
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.
Quote:
[b]
int dim = <dimensione richiesta>;
dim = (dim+getpagesize()-1) & ~(getpagesize()-1);
id = shmget(__SHM_MAGIC__, dim, IPC_CREAT|0660);

Così "dim" è un multipo di pagina, e contiene almeno la dimensione che hai richiesto.
Fico...
Cimmo è offline   Rispondi citando il messaggio o parte di esso
Old 21-10-2002, 11:32   #20
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]
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.

Fico...
Se sono terminare da '\0' va bene lo stesso metodo...o anche la più semplice strcpy...
cionci è 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: 20:10.


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