Torna indietro   Hardware Upgrade Forum > Software > Programmazione

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
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Mate X7 rinnova la sfida nel segmento dei pieghevoli premium puntando su un design ancora più sottile e resistente, unito al ritorno dei processori proprietari della serie Kirin. L'assenza dei servizi Google e del 5G pesa ancora sull'esperienza utente, ma il comparto fotografico e la qualità costruttiva cercano di compensare queste mancanze strutturali con soluzioni ingegneristiche di altissimo livello
Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-10-2002, 11: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, 14: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, 18: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, 18: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, 19: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, 21: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, 23: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, 09: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, 12: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, 13: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, 13: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, 13: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, 13: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, 14: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, 11: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, 11: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, 12: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, 12: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, 12: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, 12: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


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
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
EPOS H3 Hybrid a soli 39€: cuffie gaming...
Samsung rilancia l'assistenza: ora puoi ...
Facebook si rinnova: nuove funzioni AI p...
Da 139€ a 198€, quale scegliere fra Lefa...
Microsoft aggiorna Windows 10: in distri...
Windows 11 si aggiorna: le novità del Pa...
ECOVACS DEEBOT MINI di nuovo a meno di 2...
La Russia rallenta Telegram: nuove restr...
Nuovi standard di sicurezza per l'avvio ...
Mini-LED 34'' WQHD (3440x1440) a prezzo ...
Zero LS1 debutta in Italia: lo scooter e...
Cina, sviluppata batteria al litio semi-...
Intel TDX 1.5: 5 vulnerabilità ri...
In super sconto, con 100€ di differenza:...
Maxi TV da 75'' sotto i 600€: Hisense a ...
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: 10:47.


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