|
|||||||
|
|
|
![]() |
|
|
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: 12966
|
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: 12966
|
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: 19:51.




















