|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
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 |
![]() |
![]() |
![]() |
#2 |
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; } ![]()
__________________
3D Volley Demo (Facebook) | Reversi (Facebook) | Blockout (Facebook) | Puzzle15 (Facebook) Ultima modifica di fero86 : 03-03-2010 alle 12:01. |
![]() |
![]() |
![]() |
#3 |
Senior Member
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; } 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; } 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 Ultima modifica di -hide- : 03-03-2010 alle 21:15. |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Feb 2010
Messaggi: 466
|
Quote:
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 |
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
![]() |
![]() |
![]() |
#6 | ||
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
Quote:
![]() |
||
![]() |
![]() |
![]() |
#7 | |||
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
Quote:
![]() Quote:
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()); } } |
|||
![]() |
![]() |
![]() |
#8 |
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()); } } ![]() |
![]() |
![]() |
![]() |
#9 |
Senior Member
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. |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Mar 2005
Città: ~
Messaggi: 740
|
Quote:
Codice:
char command[256]; ... fgets(command, sizeof(command), stdin); command[sizeof(command) - 1] = 0; // forzo il finestringa ... ![]() Codice:
char command[5]; ... gets(command); ... Codice:
asdoufigisevfbspvgdobvuiseh f 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 |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
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 |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Mar 2005
Città: Morimondo city
Messaggi: 5491
|
Quote:
__________________
Khelidan |
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
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! |
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Mar 2005
Città: Morimondo city
Messaggi: 5491
|
già hai ragione era una doppia free!
__________________
Khelidan |
![]() |
![]() |
![]() |
#16 | ||
Senior Member
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; } 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:
![]() Quote:
![]() 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 |
||
![]() |
![]() |
![]() |
#17 |
Senior Member
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 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 |
![]() |
![]() |
![]() |
#18 |
Senior Member
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; } |
![]() |
![]() |
![]() |
#19 |
Senior Member
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; } |
![]() |
![]() |
![]() |
#20 |
Senior Member
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; } 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 |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:42.