|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Bannato
Iscritto dal: Nov 2002
Città: PV
Messaggi: 1210
|
[C++/C]Creare una shell x linux
Ridimensionando un po le mie mete ho deicso di scivermi una minimale shell per linux mia.
Che cosa devo leggere e sapere??? P.s: ovviamente allinizio nn avra l'history dato che sono arrivato solo alle liste bilaterali |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
La partenza del thread precedente non era male...
Parti da qualcosa di semplice, sviluppando i programmi inclusi nella shell...ad esempio cd, mv, cd, exit... Codice:
int cp(vector<string> &args)
{
...
}
int mv(vector<string> &args)
{
...
}
int cd(vector<string> &args)
{
...
}
int launcher(vector<string> &args)
{
//qui fai la fork e la exec per lanciare un programma esterno
}
int interprete(char buf[])
{
vector<string> args;
//suddividi la stringa in parole (delimitate dagli spazi) e
//le metti in args
if(args[0].compare("exit"))
return -1;
if(args[0].compare("cd"))
return cd(args);
//e così via....
return launcher(args); //se non è stato chiamata nessuna
//funzione interna, alora si è cercato di chiamare un programma esterno
}
int main(int argc, char *argv[])
{
char buf[1024];
while(1) {
do {
cout << endl << "klesh> ";
cin.getline(buf, 1023); //leggi un linea dallo standard input
if(cin.fail())
{
cerr << "Stringa troppo lunga" << endl;
cin.clear();
}
else
break;
} while(1);
switch(interprete(buf))
{
case -1: //qui puoi fare varie cose se servono
...
exit(0);
break;
//qui ci sono gli altri eventuali case
}
}
}
Ultima modifica di cionci : 05-09-2003 alle 12:14. |
|
|
|
|
|
#3 | |
|
Bannato
Iscritto dal: Nov 2002
Città: PV
Messaggi: 1210
|
Quote:
O stai stai skerzando? |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
No...non era male...era sbagliata, ma l'idea alla base non era male...
In pratica ho scritto io ciò che credevo tu intendessi fare... |
|
|
|
|
|
#5 |
|
Bannato
Iscritto dal: Nov 2002
Città: PV
Messaggi: 1210
|
la mia prima cosa giusta
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Diaciamo che come dice Elio..."Fra il dire e il fare c'è di mezzo...e il"..."e una rondella non fa primavera"... |
|
|
|
|
|
|
#7 |
|
Bannato
Iscritto dal: Nov 2002
Città: PV
Messaggi: 1210
|
e che l'avevo scritta in 2 minuti
Cmq la mia idea era quello che hai scritto tu! Ma per i comandi basta che richiamo quelli presenti in linux, no?? E come faccio a sapere se è presente o no un comando? |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#9 | |
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
Lanciare un eseguibile o un qualcosa non è così elementare. Quando esegui qualcosa come processo (e una shell lancia qualcosa come processo) devi sostituire lo spazio di indirizzi del tuo programma con quello del nuovo processo. Se questo si sovrappone al programma chiamante, il proramma crasha. Ecco perchè si crea prima un nuovo processo con una fork(), che crea un duplicato dello spazio di indirizzi che può essere sovrascritto in modo "semi" sicuro. Se un comando non esiste te ne accorgi dal fatto che la execle() o una qualsiasi famiglia di funzioni exec() ha un valore di ritorno. In caso di successo, infatti, questa famiglia di funzioni non ritornano mai. Poiche una shell non deve crashare, devi gestire l'errore. E questa è materia del signal handler... |
|
|
|
|
|
|
#10 | |
|
Bannato
Iscritto dal: Nov 2002
Città: PV
Messaggi: 1210
|
Quote:
Anche sul tannenbaum avevo letto qualcosa su fork() e su computer programming ho un articolo su processi e thread in linux. |
|
|
|
|
|
|
#11 | |
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
)Cerca in rete. Ci sono diversi tutorial sulle fork() e sulle exec(), ma sono concise e dirette al punto. Comincia con quella roba e fai esperimenti. Poi ne riparliamo. Ricordati. Se vuoi imparare, devi crearti dei problemi da solo. Ma devono essere problemi atomici e graduali, non del tipo "come costruisco un navigatore satellitare" Stavolta vado davvero
|
|
|
|
|
|
|
#12 |
|
Bannato
Iscritto dal: Nov 2002
Città: PV
Messaggi: 1210
|
secondo voi perche questo nn mi va?
Codice:
#include <pthread.h>
#include <stdio.h>
typedef struct t_arg
{
char stamp;
int volt;
}t_arg_parms;
void* func(void* parameters);
int main(int argc, char** argv[])
{
pthread_t thread1;
pthread_t thread2;
struct t_arg_parms* arg1;
arg1->stamp = "A";
arg1->stamp = 100;
struct t_arg_parms* arg2;
arg1->stamp = "B";
arg1->stamp = 100;
pthread_create(&thread1, NULL, &t_arg_parms, &arg1);
pthread_create(&thread2, NULL, &t_arg_parms, &arg2);
return 0;
}
void* func(void* parameters)
{
struct t_arg_parms* arg;
int i;
for(i = 0; i < arg->volt ; i++)
{
fputc(arg->stamp, stderr);
}
return NULL;
}
Ultima modifica di Kleidemos : 05-09-2003 alle 13:12. |
|
|
|
|
|
#13 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
STAI DEREFERENZIANDO UN PUNTATORE NON INIZIALIZZATO! Quote:
void *foo(void *param); Cmq per lanciare programmi esterni non devi usare i thread, ma la fork.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
||
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:23.











)







