PDA

View Full Version : [C++]Shell Linux


giovessj
09-07-2006, 19:15
Ciao a tutti...vorrei proporre il mio problema all'attenzione di qlkuno....
Sto realizzando una shell e ho riscontrato un problema sulla gestione dinamica della stringa in ingresso....cioè data la stringa ls -f come faccio a mettere ls in argc e -l in argv???
posto il codice:

#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>

using namespace std;

int main() {
char* argc;
char* argv[20];
const int i=0;
while(!i){
cout<<"\nNASA :>";
cin.getline(argc,50);
if(!strcmp(argc,"exit"));return 0;
else{
argv[0]= argc;
argv[1]= NULL;
pid_t pid= fork();
if (pid > 0) {
cout<<"\nIo sono il padre"<<endl;
int stato;
waitpid(pid,&stato,0);
cout<<"";
}
if (pid == 0) {cout<<"\nEccomi\n"<<endl; execvp(argc,argv); exit(0);}
else if (pid == -1) {cout<<"\nErrore"<<endl;
exit(-1);};}}
return 0;
}

Spero ke qlkuno possa aiutarmi nell'implemantazione grazie mille.....

Andlea
10-07-2006, 11:20
int main() {
char* argc;
char* argv[20];
Per prima cosa, non sono questi i parametri e non è il posto dove dichiararli
Questo è corretto
int main(int argc, char **argv)
argc è un inte che contiene il numero di parametri, argv è un vettore di char*
Il parametro 0 è il nome del programma, il file con cui lo chiami
Il primo parametro è argv[1], e così via

const int i=0;
while(!i){
Questo non è un errore ma è quantomeno bizzarro
se vuoi un ciclo infinito ti basta:
while(true)
oppure
for(;;)
ecc...

if(!strcmp(argc,"exit"));return 0;
else{
argv[0]= argc;
argv[1]= NULL;
qui ho difficoltà a capire cosa volessi fare.. argc e argv solitamente vengono soltanto letti. Tralasciando comunque che come detto argc è un int.

trallallero
10-07-2006, 11:57
Ueilah! di nuovo tu ? :)
Vedi che t'ho mandato un pvt 2 ore fa ... avevo tempo per aiutarti per l'altro problema.
Comunque oltre alle correzioni che t'ha giá detto Andlea aggiungo:
c'é un problema quando passi una stringa ad un eseguibile e la stringa contiene un "-" perché l'eseguibile lo interpreta come un parametro (almeno su unix/linux)
per esempio se ho un file di nome "-pluto" e su unix
scrivo:

rm -pluto
unix s'incacchia e mi dice


rm: opzione non consentita -- p
rm: opzione non consentita -- l
rm: opzione non consentita -- u
rm: opzione non consentita -- t
rm: opzione non consentita -- o
sintassi: rm [-fiRr] file ...

lo risolvo scrivendo

rm -- -pluto

dove -- sta per "son finiti i parametri"
Ciao :)

trallallero
10-07-2006, 12:14
T'ho fatto il programmino.
L'ho testato con: ./prova ls -ltr
e funge ;)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>


int main( int argc, char **argv )
{
char *arglist[1024]; /* LISTA PARAMETRI PER IL CHILD */
pid_t pid; /* PER LA fork() */
int i,
parm = 0;

for ( i = 1; i < argc; i++ ) /* CREO LA LISTA PARAMETRI */
arglist[parm++] = argv[i];

arglist[parm] = NULL; /* CHIUDO LA LISTA PARAMETRI */

pid = fork(); /* CLONO */

if (pid > 0)
{
puts( "\nIo sono il padre\n" );
}
else if (pid == 0)
{
puts( "\nEccomi\n" );
execvp(arglist[0], arglist); /* TRASFORMO IL CLIENT IN arglist */
}
else if (pid == -1)
{
puts( "\nErrore\n" );
exit(-1);
};

return 0;
}

andbin
10-07-2006, 12:15
c'é un problema quando passi una stringa ad un eseguibile e la stringa contiene un "-" perché l'eseguibile lo interpreta come un parametro (almeno su unix/linux)Questo succede perché molte applicazioni (specialmente quelle di "base" su linux come rm, cp, ls, ecc....) utilizzano la funzione getopt() che gestisce il parsing dei parametri in modo molto specifico ('-X' indica le opzioni "corte", '--XXX' indica le opzioni "lunghe" e solo '--' indica la fine delle opzioni).

Ma questo .... non è affatto un problema. ;)
Come una applicazione gestisca/interpreti gli argomenti .... sono capperi suoi. :D

giovessj
10-07-2006, 13:36
Si ma in tutto questo cm la faccio la gestione dinamica della stringa in ingresso??