Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr sbarca ufficialmente in Italia con tre modelli elettrici premium, X, 7X e 001, distribuiti da Jameel Motors su una rete di 52 punti vendita già attivi. La Zeekr X parte da 39.900 euro, la 7X da 54.100: piattaforma a 800V, chip Snapdragon di ultima generazione, ricarica ultraveloce e un'autonomia dichiarata fino a 615 km WLTP. Le prime consegne sono previste a metà aprile
Marathon: arriva il Fortnite hardcore
Marathon: arriva il Fortnite hardcore
Marathon è il titolo multiplayer competitivo del momento. Ecco quali sono le caratteristiche di gioco principali, insieme alle nostre prime considerazioni dopo qualche "run" nell'extraction shooter di Bungie
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare
A New York HP ha messo al centro della scena HP IQ, la piattaforma di IA locale da 20 miliardi di parametri. L’abbiamo vista in funzione: è uno strumento che funziona, pensato per un target specifico, con vantaggi reali e limiti altrettanto evidenti
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


Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti Zeekr X e 7X provate: prezzi, autonomia fino a 6...
Marathon: arriva il Fortnite hardcore Marathon: arriva il Fortnite hardcore
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare HP Imagine 2026: abbiamo visto HP IQ all’opera, ...
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è PNY RTX 5080 Slim OC, sembra una Founders Editio...
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei Wi-Fi 7 con il design di una vetta innevata: ecc...
Tutta la lineup auricolari Nothing in sc...
La serie vivo V70 arriva in Italia: cam ...
DAZN sarà visibile anche su aerei e navi...
I robot aspirapolvere ora in offerta su ...
L'Exynos 2600 a 2 nm di Samsung consuma ...
I 2 portatili migliori di tutta Amazon: ...
Tornano le offerte sui Kindle base, vers...
NVIDIA App si aggiorna: arriva DLSS 4.5 ...
Claude Code: il codice sorgente esposto ...
Recensione POCO X8 Pro: è lui lo ...
Il primo dissipatore a liquido di Noctua...
Opera Neon abilita il protocollo MCP: l'...
Dyson Clean+Wash Hygiene: lava e pulisce...
NVIDIA investe 2 miliardi in Marvell: pa...
Le GPU come garanzia bancaria: CoreWeave...
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: 08:24.


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