|
|
|
![]() |
|
Strumenti |
![]() |
#41 | |
Senior Member
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
|
Quote:
![]() ma ++x non preincrementa e x++ postincrementa? Perche' fanno la stessa cosa mettendoci ++x o x++ ? |
|
![]() |
![]() |
![]() |
#42 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Codice:
int x1 = 1; int x2 = 1; ++x1; x2++; printf("x1: %d x2: %d\n", x1, x2);
__________________
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 |
![]() |
![]() |
![]() |
#43 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Codice:
int x1 = 1; int x2 = 1; int y1; int y2; y1 = ++x1; y2 = x2++; printf("y1: %d y2: %d\n", y1, y2);
__________________
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 |
![]() |
![]() |
![]() |
#44 | |
Senior Member
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
|
Quote:
int x1=0; int x2=0; printf("%d %d",++x1,x2++); probabilmente il for usa quella regola sempre alla fine del ciclo ed e' un caso speciale, pero' ++x e' diverso da x++!!! |
|
![]() |
![]() |
![]() |
#45 | |
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 |
|
![]() |
![]() |
![]() |
#46 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Guarda ad es. che puoi fare nel terzo argomento della for:
Codice:
int main() { int x; char a[64]; for(x=0; x<5; ( sprintf(a, "%d", x++), fclose(fopen(a, "w")) )); 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 |
![]() |
![]() |
![]() |
#47 |
Senior Member
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
|
Una conferma: se io uso l'array di semafori, pero' 2 processi possono chiedere la mutuaesclusione contemporaneamente su 2 semafori diversi, io non posso usare la stessa variaibile di appoggio buf, senno' c'e' conflitto...giusto?
|
![]() |
![]() |
![]() |
#48 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Sì la puoi usare, a meno che qualche sem* non la modifichi.
Nota che bloccare due diversi semafori di seguito è un BUG che prima o poi ti porta al deadlock.
__________________
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 |
![]() |
![]() |
![]() |
#49 | |
Senior Member
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
|
Quote:
Perche' e' un bug? Se io ho un array di semafori, dove ad ogni semaforo corrisponde una risorsa differente che deadlock puo' portare? ciao Cimmo |
|
![]() |
![]() |
![]() |
#50 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Codice:
A: lock semaforo 1 (ok) B: lock semaforo 2 (ok) A: lock semaforo 2 (in attesa) B: lock semaforo 1 (in attesa) => deadlock
__________________
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 |
|
![]() |
![]() |
![]() |
#51 |
Senior Member
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
|
Si ma ogni processo da me non prende la mutuaesclusione di piu' di 1 semaforo alla volta, per prenderne un secondo deve prima rilasciare la prima risorsa...c'e' qualche controindicazione?
|
![]() |
![]() |
![]() |
#52 | |
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 |
|
![]() |
![]() |
![]() |
#53 |
Senior Member
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
|
Urgente: ma io non posso aprire piu' di un listening socket per processo? Perche' io faccio mettere piu' di un processo in ascolto di connect tcp, ma dopo che il primo si e' messo in ascolto, dal secondo processo in poi la bind mi restituisce: Err: 98 "Address already in use"
Se dovesse essere cosi', io come faccio ad avere una ricezione contemporanea di dati? |
![]() |
![]() |
![]() |
#54 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Chiaro che la bind non ti permette di stare in ascolto sulla stessa porta...
Ci sono diversi modi... 1) Sul processo padre : socket bind listen accept Appena ricevi una connessione fai la fork...ad a quel punto sul figlio gestisci il socket ricevuto dalla accept...mentre nel padre ritorni sulla accept... Se non hai problemi di prestazioni (creare un nuovo processo con la fork è molto peso) va benissimo... 2) Produttore-consumatore (prefork) Fai N fork per i consumatori (N figli)... I figli restano in attesa su una coda che arrivi una connessione da gestire... Hai un produttore (processo padre) che sta in attesa di ricevere connessioni sulla accept... Appena ne riceve una mette il socket nella coda...e ritorna in attesa di una connessione... Il primo processo figlio che viene sbloccato si prende il socket e gestisce la connessione... Per gestire la coda devi usare 2 semafori e una mutua esclusione... N è il numero di figli... Si inizializza SemA a N, SemB a 0... Immissione : Lock(SemA) Lock(mutex) immetto in coda Unlock(mutex) Unlock(SemB) Prelievo : Lock(SemB) Lock(mutex) immetto in coda Unlock(mutex) Unlock(SemA) 3) thread...anche in Linux ci dovrebbero essere i thread (pthread) Usandoli puoi benissimo recuperare un bel po' di prestazioni sul primo metodo... |
![]() |
![]() |
![]() |
#55 | |
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 |
|
![]() |
![]() |
![]() |
#56 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
![]() |
![]() |
![]() |
#57 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Fork è implementata con fork, vfork è implementata con clone.
Non esiste una definizione rigorosa della vfork; sotto linux evita la copia completa della page table del processo padre, in quanto è studiata appositamente per essere lanciata prima di un exec (che sovrascriverebbe comunque la page table). Nota che su Linux anche la fork non è molto pesante: viene duplicata la page table tra padre e figlio, ma non le pagine di memoria fisica. Le pagine di memoria vengono duplicate nel momento in cui uno dei due tenta una scrittura. Ciò è molto efficiente e comporta: - miglior gestione della memoria (le pagine che verranno solo lette non vengono duplicate) - minor latenza della fork
__________________
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 |
![]() |
![]() |
![]() |
#58 | |
Senior Member
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
|
Quote:
shmctl(id,IPC_RMID,??); Come terzo parametro che ci devo mettere? Anche i semafori rimangono in memoria? O si autoeliminano al termine del programma? Thanx... P.S.= Sto facendo un software niente male... |
|
![]() |
![]() |
![]() |
#59 | ||
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Quote:
Controlla la pagina man per vedere cosa succede quando rimuovi un set di 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 |
||
![]() |
![]() |
![]() |
#60 | |
Senior Member
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
|
Quote:
Altra domanda: ho usato il metodo strnlen di string.h e in fase di compilazione mi da' questo warning: host.c: In function `main': host.c:436: warning: implicit declaration of function `strnlen' in teoria non dovrebbe essere un errore che appare quando non includi il file header? Eppure ho incluso un file .h che a sua volta include string.h quindi non capisco perche' non lo trova... |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:14.