-
Notifications
You must be signed in to change notification settings - Fork 0
/
sExecutor.c
120 lines (112 loc) · 4.07 KB
/
sExecutor.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <stdio.h>
#include <malloc.h>
#include <memory.h>
#include <fcntl.h>
#include <wait.h>
int main(int argc, char *argv[]) {
//Numero del prossimo file da creare
int fileNumber=1;
//Numero di figli creati
int pidCount = 0;
//Motivo per cui un processo termina
int status = 0;
//Variabile di controllo per la fine dell'inserimento di un comando
int exit = 0 ;
//Numero di argomenti del comando
int argNumber = 0;
//Comando
char **command ;
//Numero di caratteri di un comando
int countChar;
//Stringa di appoggio per il salvataggio di un argomento
char *copy;
//Array e puntatore utilizzati per leggere il comando e gli agomenti
char *c;
char arr[128];
printf("Inserisci tutti i comandi e premi invio quando hai finito,\nverranno eseguiti in modo sequenziale.\n");
do {
countChar = 0;
exit = 0 ;
argNumber = 0;
c = arr;
//Nome del file da creare
char out[8] = "out.";
//Allocazione iniziale
command = (char **)malloc(sizeof(char **)*(argNumber+1));
//Lettura di un carattere alla volta del comando
while((*c = getchar()) == ' ' || *c == EOF);
if(*c == '\n'){
break;
}
*c++;
do {
*c = getchar();
//Controllo del carattere inserito
if (*c == ' '){
if (countChar > 0){//E' stato inserito piu' di un carattere prima di questo
*c = '\0';
copy = strdup(arr);//Creazione di una copia dell'argomento
command = realloc(command,sizeof(char **)*(argNumber+1));//Allocazione del puntatore ad un nuovo argomento
command[argNumber] = copy;//Inserimento della copia nel comando
c = arr;
argNumber++;
countChar = 0;
}
}else if (*c == '\n') {
if (countChar > 0) {//E' stato inserito piu' di un carattere prima di questo
*c = '\0';
copy = strdup(arr);//Creazione di una copia dell'argomento
command = realloc(command,sizeof(char **)*(argNumber+2));//Allocazione del puntatore ad un nuovo argomento
command[argNumber] = copy;//Inserimento della copia nel comando
command[argNumber + 1] = NULL;//Terminazione comando
argNumber++;
}else{
//Non ci sono caratteri da salvare, quindi inseriamo solo il terminatore
command[argNumber] = NULL;//Terminazione comando
}
exit = 1;
}else {
countChar++;
*c++;
}
} while (!exit);
*c = '\0';
//Composizione del nome del file da creare
char append[2];
sprintf(append, "%d", fileNumber);
strcat(out, append);
//Creazione del figlio
int pid = fork();
if (pid == 0) {
//Apertura file su cui scrivere
int fd;
fd = open(out, O_CREAT | O_TRUNC | O_WRONLY, 0600);
//Redirezionamento output sul file
dup2(fd, 1);
close(fd);
int resultExec = execvp(command[0], command);
if (resultExec == -1) {
//In caso di errore si rimuove il file e si termina
remove(out);
kill(getpid(),SIGKILL);
}
perror("main");
} else {
//Attendo la terminazione del figlio appena creato
int res = wait(&status);
//Controllo stato di esecuzione del figlio
if(status==0){
printf("Terminato %d con stato %d \n",res,status);
fileNumber++;
}
else {
printf("Terminato involontariamente %d con stato %d \n",res,status);
}
}
//Deallocazione della memoria
int i;
for(i = 0; i < argNumber; i++) free(command[i]);
free(command);
} while (1);
return 0;
}