Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart
Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart
Mentre Ubisoft vorrebbe chiedere agli utenti, all'occorrenza, di distruggere perfino le copie fisiche dei propri giochi, il movimento Stop Killing Games si sta battendo per preservare quella che l'Unione Europea ha già riconosciuto come una forma d'arte. Abbiamo avuto modo di parlare con Daniel Ondruska, portavoce dell'Iniziativa Europa volta a preservare la conservazione dei videogiochi
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione
Abbiamo provato il nuovo Galaxy S25 Edge, uno smartphone unico per il suo spessore di soli 5,8 mm e un peso super piuma. Parliamo di un device che ha pro e contro, ma sicuramente si differenzia dalla massa per la sua portabilità, ma non senza qualche compromesso. Ecco la nostra prova completa.
HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto
HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto
Pensato per il professionista sempre in movimento, HP Elitebook Ultra G1i 14 abbina una piattaforma Intel Core Ultra 7 ad una costruzione robusta, riuscendo a mantenere un peso contenuto e una facile trasportabilità. Ottime prestazioni per gli ambiti di produttività personale con un'autonomia lontano dalla presa di corrente che permette di lavorare per tutta la giornata
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: 12815
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: 12815
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


Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart Intervista a Stop Killing Games: distruggere vid...
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione Samsung Galaxy S25 Edge: il top di gamma ultraso...
HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto HP Elitebook Ultra G1i 14 è il notebook c...
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso Microsoft Surface Pro 12 è il 2 in 1 pi&u...
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet! Recensione REDMAGIC Astra Gaming Tablet: che spe...
Ancora in offerta a 29€ o 59€: sono i FR...
Wolfenstein arriva su Amazon Prime: sar&...
NVIDIA N1X: SoC ARM con GPU Blackwell da...
Pebble è di nuovo Pebble. Ecco il...
Accordo commerciale UE-USA: dazi al 15%,...
Amazfit GTR 3 a 69€, il Pro a 99€,T-Rex ...
Stazione tutto in uno e i pavimenti li a...
Torna il re dei mini PC con AMD Ryzen 5 ...
RTX 5000 Laptop: ASUS svela tutti i dett...
Coupon e promo Amazon su 3 super portati...
La Cina pronta a sfidare NVIDIA? Le GPU ...
Samsung, mega accordo da 16,5 miliardi p...
Le 18 offerte Amazon del weekend, senza ...
Galaxy S25 Ultra 512GB sotto i 1.000€ su...
Vi piace l'iPhone nero? Su Amazon sono s...
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: 09:42.


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