|
|
|
![]() |
|
Strumenti |
![]() |
#21 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
![]() 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 |
|
![]() |
![]() |
![]() |
#22 | |
Senior Member
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
|
Quote:
![]() Hai proprio ragione si usano tale e quale prima... Adesso mi butto sui semafori...attenti alle pressime domande... ![]() |
|
![]() |
![]() |
![]() |
#23 | |
Senior Member
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
|
Quote:
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 |
|
![]() |
![]() |
![]() |
#24 | |
Senior Member
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#25 | ||
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Quote:
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 |
||
![]() |
![]() |
![]() |
#26 | ||
Senior Member
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
|
Quote:
Poi come chiamo le 2 shmat? Visto che dovra' darmi fuori 2 valori id uno per la prima variabile, uno per la seconda... Quote:
|
||
![]() |
![]() |
![]() |
#27 | ||
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
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:
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 |
||
![]() |
![]() |
![]() |
#28 | |
Senior Member
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
|
Quote:
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? |
|
![]() |
![]() |
![]() |
#29 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
![]() |
![]() |
![]() |
#30 |
Senior Member
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 |
![]() |
![]() |
![]() |
#31 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
![]()
__________________
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 |
|
![]() |
![]() |
![]() |
#32 |
Senior Member
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 |
![]() |
![]() |
![]() |
#33 | ||
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Quote:
__________________
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 |
||
![]() |
![]() |
![]() |
#34 | |
Senior Member
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
|
Quote:
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; 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? |
|
![]() |
![]() |
![]() |
#35 |
Senior Member
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 |
![]() |
![]() |
![]() |
#36 | |
Senior Member
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
|
Quote:
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; 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"); |
|
![]() |
![]() |
![]() |
#37 | |
Senior Member
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:
__________________
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 |
|
![]() |
![]() |
![]() |
#38 |
Senior Member
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"); } |
![]() |
![]() |
![]() |
#39 |
Senior Member
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...
|
![]() |
![]() |
![]() |
#40 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
![]()
__________________
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 |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:27.