Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve
Dopo quasi un mese di utilizzo quotidiano e un viaggio medio-lungo in autostrada, raccontiamo pregi e limiti della Geely EX5: comfort premium, batteria LFP da 60,22 kWh, autonomia fino a 430 km e un prezzo che parte da 38.900 €
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-09-2003, 09:52   #21
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
però ho notato che la variabile serve a più di una funzione nel file...quindi mi serve globale...

Per fare questa variabile contatore globale, il cui valore rimane in memoria finchè non termina il programma, devo dichiarare

static int i; in testa al file?


CMQ grazie 1000 per la pazienza
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 12-09-2003, 10:03   #22
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
Altrimenti, se fosse davvero un bug, fai una funzione del genere:
Codice:
int incrementa(int add)
{
   static int i = 0;
   return i += add;
}

/*per iincrementarla*/
incrementa(1);
/*per leggerne il valore*/
incrementa(0);
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 12-09-2003, 10:29   #23
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
ho provato anche questa,ma oltre che una "porcata", manco ha funzionato...

mi chiedo: non è possibile che una variabile non possa mantenere il suo valore durante tutta l'esecuzione...ci deve essere un modo per fare una cosa del genere....
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 12-09-2003, 10:33   #24
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
Strano che non ti abbia funzionato.... Dovrebbe funzionare tranquillamente... Probabilemnte c'è qualche bug nel GCC del Cygwin...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 12-09-2003, 11:57   #25
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
voi se doveste usare una variabile contatore globale in memoria, come la dichiarereste?
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 12-09-2003, 14:17   #26
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
Così:
Codice:
#include <stdio.h>
#include "include.h"

/*extern implica che i è definita in un altro modulo oggetto*/
extern int i;

void stampa()
{
    printf("%d\n",++i);
}

int main(int argc, char *argv[])
{
  stampa();
  incrementa();
  stampa();
  incrementa();
  stampa();
  stampa();

  return 0;
}
include.h:
Codice:
void incrementa();
include.c:
Codice:
#include "include.h"
int i = 0;

void incrementa()
{
   ++i;
}
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 12-09-2003, 14:27   #27
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
ok ..ora provo..
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 12-09-2003, 15:22   #28
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
nulla

tutte le variabili globali che uso, vengono resettate quando le richiamo al nuovo ciclo...contatore sempre resettato..

Però ho scoperto che tale contatore viene portato correttamente nel main, se lo dichiaro extern nel file del main...

Appena si ripassa nell'altro file, si resetta..

Ma porca putt
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 12-09-2003, 15:35   #29
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
Ma hai fatto tutto identico a come ho fatto io ? In quale altro file ti si resetta ? Puoi farmi un esempio di situazione in cui non ti funziona ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 12-09-2003, 15:59   #30
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
allora,,

per tagliare la testa al toro, ho fatto un piccolo programmino a parte (tipo il tuo) dove uso queste variabili condivise..

il risultato è che qui funziona!!!

Quindi il problema sta nel mio programma, credo nel cilo for del main...

non so se postandovi il codice lo capireste, perchè sto progettando un proxy server http e la complessità è sostenuta...(cmq se volete vi do i files....)

Spero in qualche modo di capire perchè si resetta....

Ora mi viene un dubbio: siccome nel ciclo for del main viene fatta per ogni richiesta http una fork(), non è che nel passaggio processo padre-processo figlio, si perdono queste variabili? ..anche se ricordo che la fork duplica integralmente i dati, secondo voi c'entra qualcosa?

siete molto gentili cmq...

Ultima modifica di fedo : 12-09-2003 alle 16:03.
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 12-09-2003, 21:29   #31
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Quote:
Originariamente inviato da fedo
allora,,

per tagliare la testa al toro, ho fatto un piccolo programmino a parte (tipo il tuo) dove uso queste variabili condivise..

il risultato è che qui funziona!!!

Quindi il problema sta nel mio programma, credo nel cilo for del main...

non so se postandovi il codice lo capireste, perchè sto progettando un proxy server http e la complessità è sostenuta...(cmq se volete vi do i files....)

Spero in qualche modo di capire perchè si resetta....

Ora mi viene un dubbio: siccome nel ciclo for del main viene fatta per ogni richiesta http una fork(), non è che nel passaggio processo padre-processo figlio, si perdono queste variabili? ..anche se ricordo che la fork duplica integralmente i dati, secondo voi c'entra qualcosa?

siete molto gentili cmq...
Posta posta. Anch'io ho programmato un proxy tempo fa.
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 13-09-2003, 10:28   #32
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
ecco i sorgenti...tenete conto che sono un pò disordinati e con istruzioni di debug..

per il mio problema sono da guardare i files myproxys.c e cache.c

io penso che il problema rimanga la fork() e lo switch tra processi...

ciao
Allegati
File Type: zip myproxy.zip (9.8 KB, 3 visite)
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 13-09-2003, 10:31   #33
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Quote:
Originariamente inviato da fedo
ecco i sorgenti...tenete conto che sono un pò disordinati e con istruzioni di debug..

per il mio problema sono da guardare i files myproxys.c e cache.c

io penso che il problema rimanga la fork() e lo switch tra processi...

ciao
Grazie. Analizzo e propongo.
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 13-09-2003, 12:41   #34
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Dio santo che casino
Io penso di aver capito da dove viene il problema.
Però mi devi dire qual è la variabile incriminata (rl_slot?) e la funzione che la incrementa (ovviamente anche il sorgente dove sta questa funzione). Inoltre dimmi il sorgente dove viene richiamata questa funzione di incremento.

PS: Se vuoi un consiglio lascia stare gli editor visuali grafici. I programmi unix vanno scritti in modalità console su terminali 80x25. I commenti che hai inserito complicano troppo le cose invece che semplificarle. Hai dei commenti che prendono tre righe di terminale. Inoltre considera che se ti compila su CYGWIN non compilerà di certo sotto Linux/Unix. E' buono per fare un porting, non per scrivere codice UNIX.

Spero tu sappia usare un debugger ....
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 13-09-2003, 15:05   #35
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
grazie per i consigli...un debugger lo so usare...

Il fatto è che non sopporto nè Unix nè il C

Sono amante di Windows + Java...ti ho detto tutto

si la variabile è rl_slot..la funzione che la usa sta in fondo a cache.c

Ma guarda che il problema è certamente la fork() che sta nel main..

penso che la variabile debba essere messa in memoria condivisa per i processi che la fork genera...altrimenti ogni figlio,quando muore, fa perdere le modifiche apportate alla rl_slot .. quella del processo padre rimane sempre 0 .

Sai come mettere variabili in memoria condivisa?
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 13-09-2003, 16:29   #36
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Ho trovato il problema. Il fatto è che usi la fork() in modo totalmente errato. Innanzitutto non controlli il valore di ritorno del pid per un eventuale continuazione del processo padre.

Ti ho scritto questo programma che dovrebbe essere il minimo insieme della situazione che hai creato all'interno del tuo proxy.

Codice:
/* -*-linux-c-*-
 * Coded 13/09/2003 by mjordan - HWUPGRADE programming forum.
 * Compilare con la seguente riga di comando:
 * `gcc -Wall -std=c99 -g -O2 -D_GNU_SOURCE -o prova prova.c'
 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>

/* Variabile globale. Mai usarle per contatori. */
int i = 0;

void
var_increment(void)
{
	printf("\nOk...Siamo nel processo figlio...\n");
	printf("Valori di i.\n");
	for (int count = 0; count < 10; count++)
		printf("%d\n", ++i); /* Incrementiamo i */

	return;
}

int
main(int argc, char ** argv)
{
	int exit_status;
	pid_t pid;

	if ((pid = fork()) == 0) { /* processo figlio. */
		var_increment();
		if (WIFSIGNALED(exit_status))
			fprintf(stderr, "Processo %d: terminato dal segnale %d: %s\n",
				(int)pid, WTERMSIG(exit_status), strerror(errno));
	}
	else 
		if (pid < 0) { /* La fork() e' fallita. */
			fprintf(stderr, "fork() fallita. Buttami nel cesso.\n");
			abort();
		}
		else {
		       /* Ok. Ora siamo nel processo padre.
		        * Che valore abbiamo di i?
		        */
			pid = waitpid(pid, &exit_status, WUNTRACED);

	                printf("Ok...Siamo nel processo padre...\n");
	                printf("Valore restituito da i: %d\n", i);

	                if (i != 10)
				printf("Mmmm...Qualcosa non torna... :D\n");
		}

	return 0;
}
Questo invece è l'output:

Codice:
Ok...Siamo nel processo figlio...
Valori di i.
1
2
3
4
5
6
7
8
9
10
Processo 0: terminato dal segnale 32: Success
Ok...Siamo nel processo padre...
Valore restituito da i: 0
Mmmm...Qualcosa non torna... :D
Che cosa puoi evincere???
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 13-09-2003, 16:52   #37
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
ne evinco che è come dicevo...

per condividere il valore di quella variabile, bisogna usare una regione IPC condivisa...

solo che non ho mai usato le funzioni IPC per shared memory...

sapresti mica come usarle?

ciao
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 13-09-2003, 17:13   #38
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Ci sono due modi per effettuare un meccanismo con la shared memory fra processi. La POSIX shared memory e la System V shared memory. Dette in parole povere consistono nel creare aree di locazione di memoria condivise mediante memory mapped I/O (e che tra parentesi lavorano con i file descriptor).

Vorresti mica usare l'mmap per una sola variabile. Secondo me per come la vedo io è sbagliato l'approccio. Faresti prima a scrivere una funzione che o restituisce o incrementa la variabile dichiarata localmente alla funzione in modo statico. Così puoi leggerla anche senza farvi un accesso diretto.
Del tipo:

Codice:
int
var_increment(bool incr)
{
        static int rl_slot = 0;

        if (incr)
                return(++rl_slot);

        return rl_slot;
}
In questo modo con:

Codice:
incr_var(true);
incrementi la variabile, invece con

Codice:
incr_var(false);
la leggi semplicemente (magari all'interno del processo).

In questo modo la variabile risulta locale ad una sola funzione, ma puoi leggerne il contenuto globalmente sia nel parent che nel child process.
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 13-09-2003, 18:16   #39
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
e se io volessi usare questa variabile contatore i e questo buffer caratteri cache_reg in memoria condivisa con mmap?

come dovrei dichiararli?

so che mmap ha il parametro SHARED_MEMORY che dovrebbe fare al caso mio...

Inoltre non mi dispiacerebbe un mapping della cache anche su disco..così se il proxy crasha, non mi perdo i dati cachati..

che ne dici?
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 13-09-2003, 22:33   #40
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Quote:
Originariamente inviato da fedo
e se io volessi usare questa variabile contatore i e questo buffer caratteri cache_reg in memoria condivisa con mmap?

come dovrei dichiararli?

so che mmap ha il parametro SHARED_MEMORY che dovrebbe fare al caso mio...

Inoltre non mi dispiacerebbe un mapping della cache anche su disco..così se il proxy crasha, non mi perdo i dati cachati..

che ne dici?
Per tutto questo ti rimando alla GNU C Library Reference Manual.

http://www.gnu.org/manual/glibc-2.2....ode/index.html

Se non lo trovi li vuol dire che non esiste. Considera comunque che mmap() lavora sui file descriptor.
mjordan è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Recensione Google Pixel 11: non ha l'HiLight dei Pro, ma è il Pixel più equilibrato di sempre Recensione Google Pixel 11: non ha l'HiLight dei...
Adobe: il nuovo CEO non ha mai gestito P...
Insta360 Luna Pro presentata a IFA: sens...
Meta prova i robot nei data center: fino...
Wine 11.17 aggiunge l'emulazione delle m...
Ninja CRISPi a 99,90€: la friggitrice ad...
Gli iPhone 18 non hanno più segreti: ecc...
MacBook Pro con chip M5 Pro a 2.999€ (-5...
Dreame L50s Pro Ultra a 599€ o L60 Ultra...
Negli USA è scontro sull'IA: Zuck...
L'AI corre troppo veloce anche per OpenA...
Il prossimo top di gamma OPPO si mostra ...
AMD al lavoro su Ryzen 5 7500: stessa sc...
SBS ha svelato diverse novità a I...
Apple cambia idea, cancellato lo svilupp...
Questa RTX 3060 sembra perfetta per i mi...
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:21.


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