|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#21 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Codice:
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
char **crea_vettore(char *stringa);
void dealloca (char **array_di_stringhe);
int main(int argc, char *argv[])
{
int pid, i;
int status;
char *stringa;
//stringa dove memorizzo la stringa dei comandi
char **stringhe;
//array di stringhe
stringa = (char *) calloc(20, sizeof(char));
if ((stringa = fgets(stringa, 20, stdin)) == NULL)
exit(1);
while (strncmp(stringa, "stop", 4) != 0)
{
stringhe = crea_vettore(stringa);
if ((pid = fork()) < 0)
{
perror("fork");
exit(1);
}
else
{
if (pid == 0)
{
//figlio
if (execvp(stringhe[0], stringhe) < 0)
perror("execvp"), exit(1);
}
else
{
//padre
// aspetto la terminazione di mio figlio
wait(&status);
//dealloca(stringhe);
//libero memoria
} //fine
} //fine
} //fine while
return 0; // CI VUOLE UN RITORNO
}
char **crea_vettore(char *stringa)
{
char **stringhe;
char *parola = NULL;
int i = 0, size = 1, j = 0;
if ((stringhe = (char **) malloc(size * sizeof(char *))) == NULL)
perror("malloc"), exit(1);
//errore allocazione
while (stringa[i] != '\0')
{
//scandisco tutta la stringa e la divido in tante parole
while ((stringa[i] != ' ') && (stringa[i] != '\0') && (stringa[i] != '\n'))
{
//costruisco la parola
parola = (char *) realloc(parola, (j + 1) * sizeof(char *));
parola[j] = stringa[i];
j = j + 1;
i = i + 1;
}
if ((stringa[i] == ' ') || (stringa[i] == '\n'))
i = i + 1;
printf("parola= %s\n", parola);
if (parola != NULL)
{
//parola trovata
stringhe = (char **) realloc(stringhe, (size + 1) * sizeof(char *));
if ((stringhe[size - 1] = (char *) malloc(strlen(parola) + 1)) == NULL)
perror("malloc"), exit(1); //errore allocazione
strcpy(stringhe[size - 1], parola);
size = size + 1;
}
parola = NULL;
j = 0;
}
stringhe[size - 1] = NULL;
//fine dell array di stringhe
return (stringhe);
}
void dealloca(char **array_di_stringhe)
{
int i = 0;
while (array_di_stringhe[i] != NULL)
{
free(array_di_stringhe[i]);
i = i + 1;
}
free(array_di_stringhe[i]);
free(array_di_stringhe);
}
ma non mi sembra corretta la "crea_vettore". Solo che é un pó lungo ... devo solo fare una cosa poi se entro le 17 la finisco lo leggo meglio ps: scusa ma ho reindentato piú o meno a modo mio per capire meglio
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#22 | |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 357
|
Quote:
|
|
|
|
|
|
|
#23 |
|
Junior Member
Iscritto dal: Oct 2005
Messaggi: 20
|
Andlea è da dire ke io sn alle prime armi e quindi sinceramente nn ho capito quello ke vuoi dire...se potresti essere + gentile da spiegarti cn qlke esempio....
|
|
|
|
|
|
#24 |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 357
|
Ogni volta che ricevi un comando, crei una nuova pipe
Codice:
int piped[2]; ... pipe(piped); Nel padre farai così Codice:
close(piped[1]); // chiudi estremo di scrittura della pipe
while((nread=read(piped[0], buff, MAX_BUFF))>0)
printf("%s", buff);
Questa parte di codice non fa altro che leggere quello che esce dalla pipe e visualizzarlo a schermo Il figlio dovrà scrivere sulla pipe, per farlo fa così Codice:
close(piped[0]); close(1); dup(piped[1]); close(piped[1]); exec(.....); nell'exec farai la chiamata al comando impartito dall'utente, e il risultato verrà mandato nella pipe, ricvuta e visualizzata dal padre. Una volta finito fai la wait(&status); e ricomincerai chiedendo il comando, ecc.. |
|
|
|
|
|
#25 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
problema oracle rimandato a mercoledi
per adesso vedo un errore sbagliato: parola = (char *) realloc(parola, (j + 1) * sizeof(char *)); corretto parola = (char *) realloc(parola, (j + 1) * sizeof(char)); stai allocando una stringa non una matrice poi non ho capito il problema ... il programma chiede una serie di comandi e tu per ogni comando lanci un figlio che lo esegue ?
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
#26 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
while (strncmp(stringa, "stop", 4) != 0)
ciclo infinito se stringa é "ciao pippo pluto stop" la strncmp punterá sempre a ciao quindi condizione sempre falsa
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
#27 |
|
Junior Member
Iscritto dal: Oct 2005
Messaggi: 20
|
si esattamente...cioè nn fa altro ke ad ogni fork lanciare un figlio....
|
|
|
|
|
|
#28 |
|
Junior Member
Iscritto dal: Oct 2005
Messaggi: 20
|
quindi il ciclo while così fatto nn va bene??
|
|
|
|
|
|
#29 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
no, penso di aver capito
tu devi creare 1 figlio con la fork. La execvp ha una lista di argomenti e serve per trasformare il figlio nel programma che vuoi tu. Il primo argomento é infatti il nome del programma (per ex. ls) poi gli argomenti per i programma (per ex. -ltr pippo ...) l'ultimo argomento é NULL per far capire che é finita la lista. Il figlio quindi si trasforma nel programma specificato e gli passa gli argomenti restanti.
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
#30 |
|
Junior Member
Iscritto dal: Oct 2005
Messaggi: 20
|
si xkè tipo puo' accadere ke cm riga di comando ci possa essere:
g++ -o shell.cpp e la mia shell cmq deve rilevare tt le parole presenti nela riga... |
|
|
|
|
|
#31 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Devi fare cosí: - ottieni stringa (senza stop, non serve) - crei vettore - chiami la fork - chiami la execvp passando il vettore terminato da NULL io fra un pó devo andare. Ti posto il codice di un client di un sistema client/server che ho fatto qualche anno fa. Il sistema é lo stesso. Il server si clona, chiama la execvp e si trasforma in child passando gli argomenti. Ovviamente io ho fatto anche child.c che gestisce il client ma a te non serve perché chiami i comandi di sistema. Spero ti torni utile, é molto commentato. Codice:
/* -----------------------------------------*\
AVVIA UN PROCESSO FIGLIO.
\* -----------------------------------------*/
static void ChildBorning( int ThisSocket )
{
int pid;
if ( ThisSocket <= (stderr - stdin) ) return;
pid = fork(); // SDOPPIA IL PROCESSO ATTUALE.
if ( pid < 0 ) // ERRORE
DiagMsg(__LINE__ ,"'fork': %s" ,strerror(errno));
else if ( pid > 0 ) // PARENT
DiagMsg(__LINE__ ,"Connection signal received from PPSERVER; child starting...");
else // CHILD
{ // RILASCIA IL FILE_DESCRIPTOR DEL SOCKET DEL GENITORE.
// --- SOSTITUISCE L'IMMAGINE DEL PROGRAMMA ATTUALE ---
int parm = 0;
char buff[16];
char *arglist[7];
// ID DELLA CODA_MESSAGGI PASSATO COME PARAMETRO AL PROGRAMMA CHE SUBENTRA AL CLONE DEL GENITORE.
sprintf( buff, "%05.5d", ThisSocket );
close(sockfd);
// ACCATASTA I PARAMETRI PER IL PROGRAMMA 'CHILD'.
arglist[parm++] = "child"; // NOME PROCESSO
arglist[parm++] = buff; // NUMERO CODA MESSAGGI
if (Diagnostic) arglist[parm++] = Diagnostic; // EVENTUALE FLAG DI DIAGNOSTICA ( -d, -D )
arglist[parm++] = NULL; // FINE ARGOMENTI
// STAMPA IL COMANDO COMPLETO PER L'ESECUZIONE DI 'CHILD'.
ArgListing( arglist, "Executed", "execvp" );
execvp( arglist[0], arglist );
// SE SIAMO QUI NON RIUSCITA 'exec'
// STAMPA IL COMANDO COMPLETO PER L'ESECUZIONE DI 'CHILD'.
ArgListing(arglist ,"Failed" ,"execvp");
}
}
/* -----------------------------------------------------------------------------------*/
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#32 |
|
Junior Member
Iscritto dal: Oct 2005
Messaggi: 20
|
Ok grazie mille x la tua disponibilità sei stato gentilissimo....
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:38.



















