Ciao,
Ho scritto il codice C di una SHELL semplice pero devo raggiungere la possibiltà di avviare dei processi in background (sottofondo) quando alla fine della riga di comando viene aggiunto il simbolo &.
Il codice :
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <sys/types.h>
# include <sys/wait.h>
# include <assert.h>
# include <string.h>
enum {
MaxLine = 1024, // lunghezza max di una riga di comando
MaxParola = MaxLine / 2, // numero max di una parola nella riga
MaxDirs = 100, // numero max di directory nel PATH
MaxPathLength = 512, // lunghezza max di una parola di file
};
void tagliare(char *, char *, char **, int);
# define PROMPT "? "
int main(int argc, char * argv[]){
char line[MaxLine];
char pathname[MaxPathLength];
char * parola[MaxParola];
char * dirs[MaxDirs];
int i, tmp;
/* Tagliare PATH in directory */
tagliare(getenv("PATH"), ":", dirs, MaxDirs);
/* Leggere e trattare ogni riga di comando */
for(printf(PROMPT); fgets(line, sizeof line, stdin) != 0; printf(PROMPT)){
tagliare(line, " \t\n", parola, MaxParola);
for(i = 0; parola != 0 ; i++) ;
if (parola[0] == 0) // line vuota
continue;
tmp = fork(); // avviare processo figlio
if (tmp < 0){
perror("fork");
continue;
}
if (tmp != 0){ // padre : aspettare la fine del figlio
while(wait(0) != tmp) ;
continue;
}
// figlio : exec del programma
for(i = 0; dirs != 0; i++){
snprintf(pathname, sizeof pathname, "%s/%s", dirs, parola[0]);
execv(pathname, parola);
}
// nessun exec ha funzionato
fprintf(stderr, "%s: not found\n", parola[0]);
exit(1);
}
printf("Bye\n");
return 0;
}
/* tagliare -- tagliare una string in parole */
void tagliare(char * line, char * separ, char * parola[], int maxparola){
int i;
parola[0] = strtok(line, separ);
for(i = 1; parola[i - 1] != 0; i++){
if (i == maxparola){
fprintf(stderr, "Errore nella funzione tagliare: troppe parole\n");
parola[i - 1] = 0;
}
parola = strtok(NULL, separ);
}
}
Qualcuno potrebbe auitarmi per favore ? Sono bloccato.
Grazie
Ho scritto il codice C di una SHELL semplice pero devo raggiungere la possibiltà di avviare dei processi in background (sottofondo) quando alla fine della riga di comando viene aggiunto il simbolo &.
Il codice :
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <sys/types.h>
# include <sys/wait.h>
# include <assert.h>
# include <string.h>
enum {
MaxLine = 1024, // lunghezza max di una riga di comando
MaxParola = MaxLine / 2, // numero max di una parola nella riga
MaxDirs = 100, // numero max di directory nel PATH
MaxPathLength = 512, // lunghezza max di una parola di file
};
void tagliare(char *, char *, char **, int);
# define PROMPT "? "
int main(int argc, char * argv[]){
char line[MaxLine];
char pathname[MaxPathLength];
char * parola[MaxParola];
char * dirs[MaxDirs];
int i, tmp;
/* Tagliare PATH in directory */
tagliare(getenv("PATH"), ":", dirs, MaxDirs);
/* Leggere e trattare ogni riga di comando */
for(printf(PROMPT); fgets(line, sizeof line, stdin) != 0; printf(PROMPT)){
tagliare(line, " \t\n", parola, MaxParola);
for(i = 0; parola != 0 ; i++) ;
if (parola[0] == 0) // line vuota
continue;
tmp = fork(); // avviare processo figlio
if (tmp < 0){
perror("fork");
continue;
}
if (tmp != 0){ // padre : aspettare la fine del figlio
while(wait(0) != tmp) ;
continue;
}
// figlio : exec del programma
for(i = 0; dirs != 0; i++){
snprintf(pathname, sizeof pathname, "%s/%s", dirs, parola[0]);
execv(pathname, parola);
}
// nessun exec ha funzionato
fprintf(stderr, "%s: not found\n", parola[0]);
exit(1);
}
printf("Bye\n");
return 0;
}
/* tagliare -- tagliare una string in parole */
void tagliare(char * line, char * separ, char * parola[], int maxparola){
int i;
parola[0] = strtok(line, separ);
for(i = 1; parola[i - 1] != 0; i++){
if (i == maxparola){
fprintf(stderr, "Errore nella funzione tagliare: troppe parole\n");
parola[i - 1] = 0;
}
parola = strtok(NULL, separ);
}
}
Qualcuno potrebbe auitarmi per favore ? Sono bloccato.
Grazie