Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
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
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 28-10-2006, 15:04   #1
megamello
Member
 
L'Avatar di megamello
 
Iscritto dal: Oct 2004
Città: Viterbo
Messaggi: 37
[c] Lettura di ESATTAMENTE un carattere da input

Premesso che già conosco le funzioni getc e fgetc, il problema che ho è il seguente: voglio creare una specie di menu del tipo [1.Accedi - 2.Esci] ed il programma dovrà reagire in base all'input d 1 o 2 (o altro). il mio problema è il bufer d caratteri della tastiera (credo) in quanto una volta preso un carattere da input il programma si comporta in modo corretto, mentre mettendo in ingresso una stringa (es '111') il programma consuma prima tutto il dato in ingresso prima d proseguire (come da es stampa 3 volte comando1 poi prosegue)
vi do un abbozzo di pseudocodice del realtivo programma (non il codice perchè mi insultereste per la mia programmazione 'ad occhio'):



Quote:
printf('[1.Accedi - 2.Esci]');

comando=fgetc(stdin); //provato anche fgets da 1 char e READ da 1 byte

while (comando !=2){ //confronti fra stringhe implementati tramite strncmp
//poi tramite confronti diretti visto che strnp andava
// in segmentation fault

if (comando=1) printf('comando1');

printf('[1.Accedi - 2.Esci]');
comando=fgetc(stdin);
}
exit(0);

giusto un abbozzo per dare un'idea. come posso implementare la laettura d 1 carattere soltanto, buttendo il resto ( e utilizzando funzioni 'sicure' che mi garantiscono di prendere un numero definito di byte in input)? ho provato mettendo vettori di char d 2 byte , con il primo significativo e sul secondo andavo a scrivere un EOF, ma nn sembrava curarsene + di tanto.

il "comando1" in realtà sarebbe una fork seguita da una exec per un client. già che ci sono vi chiedo anche: se faccio una fork e sul figlio una exec, ilprocesso padre rimanente attivo, come si comportano i programmi? il figlio va sulla stessa shell o su un'altra istanza della shell? posso implementare accesso concorrente con questo metodo (es 2 utenti che utilizzano 2 client diversi generati dallo stesso padre)?

ok mi sono reso conto di essermi espresso malissimo, ma non ho voglia di sistemare, accontentatevi (più che altro spero che qualcuno capisca lo stesso così da potermi aiutare)

[ambiente Linux/Unix]
__________________
Kill, it's such a friendly word
megamello è offline   Rispondi citando il messaggio o parte di esso
Old 28-10-2006, 17:12   #2
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Codice:
char comando;
...
comando = 0;
while (comando != 2)
{
	printf("[1.Accedi - 2.Esci]");
	comando = getchar();
	/* Pulisco il buffer di input. */
	while (getchar() != '\n');
	if (isdigit(comando))
	{
		if (comando == 1)
		{
			printf("\nComando 1\n\n");
			/* Operazioni varie... */
		}
	}
	else
		printf("\nComando non valido. Riprovare...\n\n");
}
...
return 0;
Quote:
Originariamente inviato da megamello
il "comando1" in realtà sarebbe una fork seguita da una exec per un client. già che ci sono vi chiedo anche: se faccio una fork e sul figlio una exec, ilprocesso padre rimanente attivo, come si comportano i programmi? il figlio va sulla stessa shell o su un'altra istanza della shell? posso implementare accesso concorrente con questo metodo (es 2 utenti che utilizzano 2 client diversi generati dallo stesso padre)?
Il processo padre rimane attivo, mentre il processo figlio sostituisce (nel caso della famiglia di funzioni exec()) l'immagine del suo processo con quella del processo specificato nella exec(). Quindi il processo figlio diventa "indipendente" dal processo padre, per quanto, essendo il pid del figlio sempre lo stesso, il padre può ad esempio fare una wait() per attendere il figlio, ecc.

EDIT: Per quanto riguarda la fork() (peraliamo quindi di unix/linux/e simili) prova questo semplice programma:

Codice:
#include <stdio.h>
#include <unistd.h>

int main(void)
{
	int pid, status;

	if ((pid = fork()) == 0)
	{
		/* Sono il figlio. */
		printf("Sono il figlio: pid %d\n\n", getpid());
		execl("/bin/ls", "ls" "-l", "-a", (char *) 0);
		/* Prova a mettere del codice qui sotto... */
	}
	else
	{
		/* Sono il padre. */
		printf("Sono il padre: pid %d, pid del figlio %d\nAttendo la terminazione del figlio...\n\n", getpid(), pid);
		wait(&status);
		printf("Figlio terminato, uscita.\n");
	}
	return 0;
}
Prova anche a sostituire un altro programma per la execl, magari uno che richiede più tempo di esecuzione, per vedere meglio il comportamento del padre.
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson

Ultima modifica di -fidel- : 28-10-2006 alle 17:56.
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 28-10-2006, 17:35   #3
megamello
Member
 
L'Avatar di megamello
 
Iscritto dal: Oct 2004
Città: Viterbo
Messaggi: 37
si, so come funzionano fork ed exec, ma mi chiedevo se sulla stessa shell l'esecuzione dei due (amesso che rimangano entrambi attivi) è interlacciata o no, e mi chiedevo anche cosa succederebbe se si facesse partire un nuovo client tramite il processo padre (facendo una nuova fork + exec) mentre già c'è un figlio attivo
__________________
Kill, it's such a friendly word
megamello è offline   Rispondi citando il messaggio o parte di esso
Old 28-10-2006, 17:42   #4
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Quote:
Originariamente inviato da megamello
si, so come funzionano fork ed exec, ma mi chiedevo se sulla stessa shell l'esecuzione dei due (amesso che rimangano entrambi attivi) è interlacciata o no, e mi chiedevo anche cosa succederebbe se si facesse partire un nuovo client tramite il processo padre (facendo una nuova fork + exec) mentre già c'è un figlio attivo
Cosa intendi per shell interlacciata? Vuoi dire se tutti i processi figli stampano l'output sulla sulla shell del padre?
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 28-10-2006, 17:54   #5
megamello
Member
 
L'Avatar di megamello
 
Iscritto dal: Oct 2004
Città: Viterbo
Messaggi: 37
si esattamente questo, grazie. devo implementare una lettura e scrittura su memoria condivisa (mem creata dal padre, lettura e scrittura fatte dai figli), com possibilità di concorrenza in lettura/scrittura/cancellazione (da gestire tramite semafori). in pratica quello che mi chiedo è come lanciare + istanze del processo figlio dallo stesso padre (in modo che + figli utilizzino la stessa memoria condivisa) e pensavo d farlo appunto lasciando aperto il padre in atesa di ordini (accedi-esci) ma non so se sarebbe una soluzione valida, oppure se mi converrebbe fare una chiamata shmget in modo non esclusivo e far partire + istanze "padri" ognuna che genera un filgio ed aspetta la terminazione (la mem condiisa creata è unica x tutti i processi così come i semafori o sbaglio?) anche se poi dovrei far sincronizzare i padri in modo chel'ultimo ke si chiude elimini la mem condivisa
__________________
Kill, it's such a friendly word

Ultima modifica di megamello : 28-10-2006 alle 18:01.
megamello è offline   Rispondi citando il messaggio o parte di esso
Old 28-10-2006, 18:00   #6
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Quote:
Originariamente inviato da megamello
si esattamente questo, grazie. devo implementare una lettura e scrittura su memoria condivisa (mem creata dal padre, lettura e scrittura fatte dai figli).
Sì, tutti i processi stampano sulla shell del padre, ma guarda che dopo la execve() (e simili) perdi i puntatori alla memoria condivisa (come si evince dal codice postato prima, dopo una exec non c'è controllo da parte del figlio in caso di successo della exec(), per i motivi descritti prima).
Come descritto anche nella manpage di execve:
Quote:
RETURN VALUE
If one of the exec functions returns to the calling process image, an error has occurred; the return alue shall be -1, and errno shall be set to indicate the error.
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 28-10-2006, 18:02   #7
megamello
Member
 
L'Avatar di megamello
 
Iscritto dal: Oct 2004
Città: Viterbo
Messaggi: 37
si so della perdita, infatti la shm attach l'avrei messa sul figlio...cmq leggi il post sopra per favore, che dopo l'edit è diventato un poema
grazie di tutto l'aiuto cmq
__________________
Kill, it's such a friendly word
megamello è offline   Rispondi citando il messaggio o parte di esso
Old 28-10-2006, 18:11   #8
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Quote:
Originariamente inviato da megamello
si so della perdita, infatti la shm attach l'avrei messa sul figlio...cmq leggi il post sopra per favore, che dopo l'edit è diventato un poema
Se vuoi che il/i figlio/i del padre siano controllabili anche dopo l'esecuzione di un comando esterno, non usare execve(), bensì system(). La differenza sta nel fatto che la system apre in automatico un nuovo processo e lancia il comando: quando il comando è terminato il controllo ritorn al figlio (che esiste, la sua immagine non è stata sostituita).
In questo modo non hai alcun bisogno di usare memoria condivisa per far dialogare padre e figli: ti basta usare l'exit code del filgio per far capire al padre come è andata.
Nel caso di un solo figlio (come si vede nel mio esempio), tramite la wait(&status) leggi in status il codice di ritorno del figlio (quello passato dalla return del figlio), se invece hai più figli, puoi usare la waitpid() oppure (molto meglio e più facile da gestire) usare una signal() sul segnale SIGCHLD per essere segnalati ogni qual volta un figlio termina (e nella routine di gestione del segnale puoi facilmente sapere il pid del figlio che ha terminato (ed ovviamente il suo exit code).
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson

Ultima modifica di -fidel- : 28-10-2006 alle 18:15.
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 28-10-2006, 18:15   #9
megamello
Member
 
L'Avatar di megamello
 
Iscritto dal: Oct 2004
Città: Viterbo
Messaggi: 37
il fatto è che DEVO usare una memoria condivisa, in quanto i figli la devono usare come se fosse una bacheca per messaggi... sono fattibili le soluzioni che ho proposto prima?
__________________
Kill, it's such a friendly word
megamello è offline   Rispondi citando il messaggio o parte di esso
Old 28-10-2006, 18:25   #10
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Ti consiglio di fare come segue:
1) il padre (main) crea la memoria condivisa.
1) il padre crea i figli: tutti i figli ereditano automaticamente una copia del puntatore alla memoria condivisa
3) i figli (e il padre) accedono alla memoria condivisa in mutua esclusione (sezione critica).
4) il padre può controllare in qualunque momento la terminazione dei figli (ed il modo in cui sono terminati) tramite una signal() su SIGCHLD
5) Se i figli devono lanciare nuovi processi esterni, usa la system() invece della execve() (per avere il controllo del figlio anche dopo la terminazione del comando esterno).
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 28-10-2006, 18:39   #11
megamello
Member
 
L'Avatar di megamello
 
Iscritto dal: Oct 2004
Città: Viterbo
Messaggi: 37
Quote:
1) il padre crea i figli: tutti i figli ereditano automaticamente una copia del puntatore alla memoria condivisa
è applicabile al creare un figlio in un qualsiasi momento o intendi dire che il padre deve creare tot istanze ed aspettare la terminazione? avrei bisognodi dinamicità in questo, appunto vorrei tenere il padre aperto (e attivo) per far partire una nuova istanza figlio arbitrariamente
__________________
Kill, it's such a friendly word
megamello è offline   Rispondi citando il messaggio o parte di esso
Old 28-10-2006, 19:25   #12
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Quote:
Originariamente inviato da megamello
è applicabile al creare un figlio in un qualsiasi momento o intendi dire che il padre deve creare tot istanze ed aspettare la terminazione? avrei bisognodi dinamicità in questo, appunto vorrei tenere il padre aperto (e attivo) per far partire una nuova istanza figlio arbitrariamente
Sì sì i figli li lanci quando vuoi, e li tracci con una signal() su SIGCHLD. Non importa quanti figli hai o quando sono stati lanciati, l'importante è avere l'accesso in mutua esclusione alla sezione critica e controllare (da parte del padre) la terminazione dei suoi figli.

EDIT: comunque io uso raramente (anzi direi quasi mai...) la memoria condivisa per far dialogare i processi (devi stare molto attento ad usarla per quanto riguarda la sicurezza), meglio usare pipes + semafori (implementati sempre con una pipe per semplicità) per far dialogare/scambiare dati tra più processi. Poi se ti è stato richiesto esplicitamente di usare la memoria condivisa, oppure ne hai assolutamente bisogno e non sai come fare altrimenti... (ma di solito si trova sempre un'alternativa, anche di uguale/minore complessità implementativa)
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson

Ultima modifica di -fidel- : 28-10-2006 alle 19:35.
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 28-10-2006, 20:51   #13
megamello
Member
 
L'Avatar di megamello
 
Iscritto dal: Oct 2004
Città: Viterbo
Messaggi: 37
eh si è necessario utilizzare la mem condivisa da richiesta, deve essere usata tipo bacheca dai processi figli...ti rignrazio ancora per l'aiuto che mi hai dato, penso di essere a posto per ora
__________________
Kill, it's such a friendly word
megamello è offline   Rispondi citando il messaggio o parte di esso
Old 05-11-2006, 14:04   #14
megamello
Member
 
L'Avatar di megamello
 
Iscritto dal: Oct 2004
Città: Viterbo
Messaggi: 37
scusate ma ho ancora problemi...viposto direttamente il codice poi spiego...

Quote:
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

typedef struct {
char userid[10];
char oggetto[20];
char messaggio[100];
} messaggio;

void login(){

char comando;
char stor[2];
int n;

printf("1. Accedi - 2.Esci \n");

comando = fgetc(stdin);
while(fgetc(stdin) != '\n');


if (!isdigit(comando)){printf("Comando non valido. Riprovare.\n 1. Accedi - 2.Esci \n");
comando = fgetc(stdin);
while(fgetc(stdin) != '\n');}

while(comando!='2'){

if (comando=='1') {

//int pid = fork();

//if (pid == -1) puts("Errore nella chiamata fork()");

//if (pid == 0) execl("client", "Client",0);

printf("comando 1 \n");

}


else printf("Comando non valido. Riprovare.");

printf("1. Accedi - 2.Esci \n");

comando = fgetc(stdin);
while(fgetc(stdin) != '\n');

}
exit(1);

}

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

int ds_shm;
key_t key = 001000;

if ((ds_shm = shmget(key, 20480, IPC_CREAT|0666))<0){
puts("Errore shmget");exit(-3);}

login();

/*CREA SEMAFORI!!!!!*/

}
scusate la mancanza di indentazione.

Allora, il programma (in particolare la funzione login() ) dovrebbe prendere 1 carattere in input e a seconda se sia 1, 2 o altro, dovrebbe stampare comando1, uscire o stampare Comando non valido ( e ciclare). funziona discretamente se non fosse che ha problemi con stringhe di più di un carattere, ossia, se passo stringhe di caratteri casuali in input stampa Comando nonvalido, ma se le stringhe iniziano con 1 o 2 , allora stampa comando1 nel primo caso ed esce nel secondo. come posso fare per evitare ciò?

una domanda....il programma può generare inconsistenza sui dati? c'è pericolo che ciò che passo in ingresso venga memorizzato a partire da char comando e i caratteri seguenti il primo vadano a "sporcare" zone di memoria? utilizzo fgetc per evitare situazioni del genere, ma vorrei avere la certezza....

grazie a tutti per l'aiuto
__________________
Kill, it's such a friendly word
megamello è offline   Rispondi citando il messaggio o parte di esso
Old 07-11-2006, 00:11   #15
megamello
Member
 
L'Avatar di megamello
 
Iscritto dal: Oct 2004
Città: Viterbo
Messaggi: 37
*UP*
__________________
Kill, it's such a friendly word
megamello è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
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 ...
Dreamforce 2026: Salesforce punta sulla ...
SpaceX ha confermato che Flight 14 sar&a...
Googlebook pronto al debutto: Google apr...
Guida all'acquisto: quale lavapavimenti ...
Google Maps su Android Auto introduce fi...
AMD Ryzen 5 5500F: fino al 16% di presta...
L'ecosistema partner di Microsoft cresce...
Oracle registra un boom nella divisione ...
Amazon Prime Video sfida TikTok con le n...
L'uscita di Rayman Legends Retold &egrav...
Dazio UE sui pacchi extra UE, in Italia ...
La nuova lavatrice smart di Xiaomi ha tr...
Hai una PSP nel cassetto? Questo nuovo p...
Oracle presenta Java 27 con diverse novi...
Il microscopio dell'EPFL vede più...
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: 07:06.


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