Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Attenti a Poco F7: può essere il best buy del 2025. Recensione
Attenti a Poco F7: può essere il best buy del 2025. Recensione
Poco F7 5G, smartphone che punta molto sulle prestazioni grazie al processore Snapdragon 8s Gen 4 e a un display AMOLED da ben 6,83 pollici. La casa cinese mantiene la tradizione della serie F offrendo specifiche tecniche di alto livello a un prezzo competitivo, con una batteria generosissima da 6500 mAh e ricarica rapida a 90W che possono fare la differenza per gli utenti più esigenti.
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Abbiamo provato per molti giorni il nuovo Z Fold7 di Samsung, un prodotto davvero interessante e costruito nei minimi dettagli. Rispetto al predecessore, cambiano parecchie cose, facendo un salto generazionale importante. Sarà lui il pieghevole di riferimento? Ecco la nostra recensione completa.
The Edge of Fate è Destiny 2.5. E questo è un problema
The Edge of Fate è Destiny 2.5. E questo è un problema
Bungie riesce a costruire una delle campagne più coinvolgenti della serie e introduce cambiamenti profondi al sistema di gioco, tra nuove stat e tier dell’equipaggiamento. Ma con risorse limitate e scelte discutibili, il vero salto evolutivo resta solo un’occasione mancata
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 03-03-2010, 10:36   #1
-hide-
Senior Member
 
L'Avatar di -hide-
 
Iscritto dal: Sep 2008
Città: Messina
Messaggi: 991
[C] Creare una shell

Ciao ragazzi.
Ho iniziato da poco a seguire il corso di Sistemi Operativi pensando a come studiare al meglio questa materia divertendomi un pò.
L'idea è quella di creare una shell ma non trovo abbastanza materiale googlando. Sapete darmi qualche informazione?!
__________________

PC/HTPC: Mac Mini 3,1 late 2009 | My Book Studio 2TB | LG M237WD monitor/tv | Logitech Z4 | Apple Magic Mouse | Apple Wireless Keyboard | Apple Remote
Mobile: Samsung Galaxy Wonder i8150 cm9
LinkedIn
-hide- è offline   Rispondi citando il messaggio o parte di esso
Old 03-03-2010, 11:57   #2
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
Codice:
#include <stdlib.h>
#include <stdio.h>

int main() {
	char *psz = NULL;
	size_t cb;
	do {
		free(psz);
		getline(&psz, &cb, stdin);
		system(psz);
	} while (strcmp(psz, "exit"));
	return 0;
}

Ultima modifica di fero86 : 03-03-2010 alle 12:01.
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 03-03-2010, 19:16   #3
-hide-
Senior Member
 
L'Avatar di -hide-
 
Iscritto dal: Sep 2008
Città: Messina
Messaggi: 991
Codice:
#include <stdlib.h>
#include <stdio.h>

int main() {
	char *psz = NULL;
	size_t cb;
	do {
		free(psz);
		getline(&psz, &cb, stdin);
		system(psz);
	} while (strcmp(psz, "exit"));
	return 0;
}
Questa dichiarazione, ed il suo successivo utilizzo, a che serve?!
Codice:
#include <stdlib.h>
#include <stdio.h>

int main() {
	char *psz = NULL;
	size_t cb;
	do {
		free(psz);
		getline(&psz, &cb, stdin);
		system(psz);
	} while (strcmp(psz, "exit"));
	return 0;
}
Quest'altra istruzione invece?

Inoltre mi da questo errore, che roba è?
Codice:
Undefined symbols:
  "_getline", referenced from:
      _main in ccQsPdgz.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
__________________

PC/HTPC: Mac Mini 3,1 late 2009 | My Book Studio 2TB | LG M237WD monitor/tv | Logitech Z4 | Apple Magic Mouse | Apple Wireless Keyboard | Apple Remote
Mobile: Samsung Galaxy Wonder i8150 cm9
LinkedIn

Ultima modifica di -hide- : 03-03-2010 alle 21:15.
-hide- è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2010, 00:24   #4
bobbytre
Senior Member
 
L'Avatar di bobbytre
 
Iscritto dal: Feb 2010
Messaggi: 466
Quote:
Originariamente inviato da -hide- Guarda i messaggi
Codice:
#include <stdlib.h>
#include <stdio.h>

int main() {
	char *psz = NULL;
	size_t cb;
	do {
		free(psz);
		getline(&psz, &cb, stdin);
		system(psz);
	} while (strcmp(psz, "exit"));
	return 0;
}
Questa dichiarazione, ed il suo successivo utilizzo, a che serve?!
Codice:
#include <stdlib.h>
#include <stdio.h>

int main() {
	char *psz = NULL;
	size_t cb;
	do {
		free(psz);
		getline(&psz, &cb, stdin);
		system(psz);
	} while (strcmp(psz, "exit"));
	return 0;
}
Quest'altra istruzione invece?

Inoltre mi da questo errore, che roba è?
Codice:
Undefined symbols:
  "_getline", referenced from:
      _main in ccQsPdgz.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
size_t è un tipo , più precisamente un intero senza segno , e viene usato per le dimensioni es. di un file , o di un buffer.

system è una funzione che fa eseguire al sistema operativo il comando passato.

per risolvere il problema che ti da getline , prova a sostituire la funzione , usa gets
bobbytre è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2010, 00:31   #5
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da fero86 Guarda i messaggi
Codice:
#include <stdlib.h>
#include <stdio.h>

int main() {
	char *psz = NULL;
	size_t cb;
	do {
		free(psz);
		getline(&psz, &cb, stdin);
		system(psz);
	} while (strcmp(psz, "exit"));
	return 0;
}
Azz, che fai, una free() su un puntatore a NULL? KA-BOOM!
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2010, 13:01   #6
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Azz, che fai, una free() su un puntatore a NULL? KA-BOOM!
tratto da http://linuxmanpages.com/man3/free.3.php :
Quote:
free() frees the memory space pointed to by ptr, which must have been returned by a previous call to malloc(), calloc() or realloc(). Otherwise, or if free(ptr) has already been called before, undefined behaviour occurs. If ptr is NULL, no operation is performed.
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2010, 13:08   #7
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
Quote:
Originariamente inviato da -hide- Guarda i messaggi
Questa dichiarazione, ed il suo successivo utilizzo, a che serve?!
é solo per dare qualcosa alla getline. la documentazione non dice che li posso mettere NULL (almeno non mi pare).



Quote:
Quest'altra istruzione invece?
come sarebbe a dire, non mi dire che non hai mai fatto system("PAUSE") per evitare che la console del programma si chiuda subito



Quote:
Inoltre mi da questo errore, che roba è?
chiedo scusa, mi accorgo solo ora che la getline é un'estensione GNU.
scrivere una shell in C é molto difficile a causa del solo idiotissimo compito di leggere un'intera linea dallo standard input: il 90% del codice é quello
perció te la riscrivo in C++ perfettamente standard:
Codice:
#include <iostream>
#include <cstdlib>

using namespace std;

int main() {
	while (true) {
		string strLine;
		getline(cin, strLine);
		if ((strLine == "exit") || cin.eof()) {
			return 0;
		}
		system(strLine.c_str());
	}
}
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2010, 13:11   #8
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
piccolo perfezionamento:
Codice:
#include <iostream>
#include <cstdlib>

using namespace std;

int main() {
	while (true) {
		cout << "> ";
		string strLine;
		getline(cin, strLine);
		if ((strLine == "exit") || cin.eof()) {
			return 0;
		}
		system(strLine.c_str());
	}
}
cosi stampa anche un prompt
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2010, 13:20   #9
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
una shell in C (ottimo esercizio secondo me).

Si può fare in vari modi, potresti anche pensare ad un modello client-server... una shell remota insomma forse è ancora meglio come esercizio.

Dovresti darti un occhio al multiplexing in C. Nonchè alla programmazione di rete.
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2010, 13:24   #10
maulattu
Senior Member
 
L'Avatar di maulattu
 
Iscritto dal: Mar 2005
Città: ~
Messaggi: 740
Quote:
Originariamente inviato da bobbytre Guarda i messaggi
size_t è un tipo , più precisamente un intero senza segno , e viene usato per le dimensioni es. di un file , o di un buffer.

system è una funzione che fa eseguire al sistema operativo il comando passato.

per risolvere il problema che ti da getline , prova a sostituire la funzione , usa gets
Meglio la fgets:
Codice:
char command[256];
...
fgets(command, sizeof(command), stdin);
command[sizeof(command) - 1] = 0; // forzo il finestringa
...
la gets fa caghèr ():
Codice:
char command[5];
...
gets(command);
...
prova a digitare da tastiera
Codice:
asdoufigisevfbspvgdobvuiseh f
tutta sta roba vien messa in una stringa, o meglio, array di 5 elementi...
o segmenta o sporcacci tutta la memoria/variabili memorizzate dopo "command"
__________________
Ciao ciao cagnolino Billy
MacMini late 2009, 2.53GHz, 4GB ram, 320GB hard disk, Snow Leopard 10.8.2 - iPod Nano 6th gen.
XBOX Live GamerTag: InsaneMau
maulattu è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2010, 13:25   #11
maulattu
Senior Member
 
L'Avatar di maulattu
 
Iscritto dal: Mar 2005
Città: ~
Messaggi: 740
EDIT: doppio...
__________________
Ciao ciao cagnolino Billy
MacMini late 2009, 2.53GHz, 4GB ram, 320GB hard disk, Snow Leopard 10.8.2 - iPod Nano 6th gen.
XBOX Live GamerTag: InsaneMau
maulattu è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2010, 14:14   #12
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da fero86 Guarda i messaggi
Ohibò, hai ragione...

__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2010, 14:25   #13
khelidan1980
Senior Member
 
L'Avatar di khelidan1980
 
Iscritto dal: Mar 2005
Città: Morimondo city
Messaggi: 5491
Quote:
Originariamente inviato da fero86 Guarda i messaggi
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Ohibò, hai ragione...

mah comunque a me su linux dava un errore di compilazione ( o in esecuzione non ricordo bene ) la free su un puntatore null, mentre su window compilava!Me lo ricordo bene perchè ci persi un bel po di tempo
__________________
Khelidan
khelidan1980 è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2010, 14:41   #14
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da khelidan1980 Guarda i messaggi
mah comunque a me su linux dava un errore di compilazione ( o in esecuzione non ricordo bene ) la free su un puntatore null, mentre su window compilava!Me lo ricordo bene perchè ci persi un bel po di tempo
No, mi sa che mi confondevo anche io con una cosa simile (il problema è su una doppia free(), dove non hai resettato il puntatore a NULL ma la memoria è già stata liberata).
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2010, 14:43   #15
khelidan1980
Senior Member
 
L'Avatar di khelidan1980
 
Iscritto dal: Mar 2005
Città: Morimondo city
Messaggi: 5491
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
No, mi sa che mi confondevo anche io con una cosa simile (il problema è su una doppia free(), dove non hai resettato il puntatore a NULL ma la memoria è già stata liberata).
già hai ragione era una doppia free!
__________________
Khelidan
khelidan1980 è offline   Rispondi citando il messaggio o parte di esso
Old 05-03-2010, 08:51   #16
-hide-
Senior Member
 
L'Avatar di -hide-
 
Iscritto dal: Sep 2008
Città: Messina
Messaggi: 991
Ammazza quante risposte in un giorno
Scusate se io rispondo ora ma sono stato di esami.

Ringrazio per il codice in C++, però è inutile per i miei studi! Io conosco solo il C (anche se noto di riuscire a capirlo un pò).

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

int main() {
	char *psz = NULL;
	size_t cb;
	do {
		free(psz);
		getline(&psz, &cb, stdin);
		system(psz);
	} while (strcmp(psz, "exit"));
	return 0;
}
Ieri mi ero scritto il codice e l'avevo portato all'Uni per dargli un'occhiata nei momenti di noia. Io non comprendo perché deallocare la memoria di una variabile e subito dopo utilizzarla ella getline.
Se non ricordo male, free libera lo spazio di memoria occupato precedentemente dalla variabile psz. La successiva memorizzazione della getline in quella variabile dovrebbe giustamente fallire.

Quote:
Originariamente inviato da fero86
come sarebbe a dire, non mi dire che non hai mai fatto system("PAUSE") per evitare che la console del programma si chiuda subito
Si certo, ma su quella variabile non so che effetti dia

Quote:
Originariamente inviato da Teo@Unix
una shell in C (ottimo esercizio secondo me).

Si può fare in vari modi, potresti anche pensare ad un modello client-server... una shell remota insomma forse è ancora meglio come esercizio.

Dovresti darti un occhio al multiplexing in C. Nonchè alla programmazione di rete.
Certo, ma intanto volevo iniziare dal basso. Non ho ancora studiato le chiamate di sistema quindi attenderei per destreggiarmi tra evoluzioni di vario tipo. Grazie!


Ma quindi alla fine, nella sostanza, devo usare la fgets?!
__________________

PC/HTPC: Mac Mini 3,1 late 2009 | My Book Studio 2TB | LG M237WD monitor/tv | Logitech Z4 | Apple Magic Mouse | Apple Wireless Keyboard | Apple Remote
Mobile: Samsung Galaxy Wonder i8150 cm9
LinkedIn
-hide- è offline   Rispondi citando il messaggio o parte di esso
Old 05-03-2010, 09:18   #17
-hide-
Senior Member
 
L'Avatar di -hide-
 
Iscritto dal: Sep 2008
Città: Messina
Messaggi: 991
Facendo due conti ho estrapolato questa versione.

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

int main (void) { // apro main
	char command[256];
	while (strcmp (command, "exit")) { // apro while
		fgets (command, sizeof (command), stdin);
		system (command);
		} // chiudo while
	return 0;
} // chiudo main
- la compilazione viene effettuata (e questo è già un traguardo);
- la comparazione di uscita non la fa, in pratica mi ritrovo in un ciclo infinito;
- funziona solo "ls" sembra
__________________

PC/HTPC: Mac Mini 3,1 late 2009 | My Book Studio 2TB | LG M237WD monitor/tv | Logitech Z4 | Apple Magic Mouse | Apple Wireless Keyboard | Apple Remote
Mobile: Samsung Galaxy Wonder i8150 cm9
LinkedIn
-hide- è offline   Rispondi citando il messaggio o parte di esso
Old 05-03-2010, 09:40   #18
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12822
A me così funziona:

Codice:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <iso646.h>

int main(void) {

	char str[256];
	do {
		printf("Cmd> "); // stampa il prompt

		fgets(&str[0], 255, stdin); // acquisisce la stringa dall'input

		system(&str[0]); // esegue il comando specificato in str
	}
	while(!strcmp(&str[0], "exit\n")); // se str contiene "exit" termina

	return 0;
}
strcmp ritorna 0 se sono uguali le stringhe.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 05-03-2010, 09:58   #19
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12822
Versione un po' più "pulita":

Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define CMD_LENGTH 256

void getLine(char* str, int n) {
	fgets(str, n, stdin);
}

int main(void) {

	char str[CMD_LENGTH];
	do {
		printf("Cmd> ");

		getLine(&str[0], CMD_LENGTH);

		system(str);
	}
	while(strcmp(str, "exit\n"));


	return 0;
}
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 05-03-2010, 14:16   #20
-hide-
Senior Member
 
L'Avatar di -hide-
 
Iscritto dal: Sep 2008
Città: Messina
Messaggi: 991
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define CMD_buffer 256 

int main (void) {
	char cmdline [CMD_buffer];
	while (strcmp (cmdline, "exit\n")) {
		printf ("cmd> ");
		fgets (cmdline, sizeof (cmdline), stdin);
		system (cmdline);
		}
	return 0;
}
Questo codice funziona pure, più o meno!
Non capisco perché "ls" viene riconosciuto mentre "cd" non causa alcun effetto (ne ho scelti due a caso che ho provato).
__________________

PC/HTPC: Mac Mini 3,1 late 2009 | My Book Studio 2TB | LG M237WD monitor/tv | Logitech Z4 | Apple Magic Mouse | Apple Wireless Keyboard | Apple Remote
Mobile: Samsung Galaxy Wonder i8150 cm9
LinkedIn
-hide- è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Attenti a Poco F7: può essere il best buy del 2025. Recensione Attenti a Poco F7: può essere il best buy...
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale Recensione Samsung Galaxy Z Fold7: un grande sal...
The Edge of Fate è Destiny 2.5. E questo è un problema The Edge of Fate è Destiny 2.5. E questo ...
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello Ryzen Threadripper 9980X e 9970X alla prova: AMD...
Acer TravelMate P4 14: tanta sostanza per l'utente aziendale Acer TravelMate P4 14: tanta sostanza per l'uten...
Grok Imagine: evoluzione dell'IA o nuova...
L'Italia saluta anche IVECO: finalizzata...
Summer Black Friday: spendi meno e godit...
Half-Life 3? No, Gabe Newell produrr&agr...
Apple al lavoro su un sensore che "...
TSMC vittima di spionaggio industriale s...
Cooler Master MasterFrame 500: un flusso...
Apple accelera sull'IA interna: c'&egrav...
I robotaxi arrivano in Europa: Lyft e Ba...
Ancora voci sul mega tablet pieghevole d...
Un computer quantistico con 10.000 qubit...
AVM cambia nome e faccia: ora si chiama ...
SatNet ha lanciato altri satelliti per l...
Flop autonomia per la Fiat Grande Panda ...
2 TV LG da favola in super sconto: OLED ...
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: 20:42.


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