-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patha.c
114 lines (93 loc) · 2.27 KB
/
a.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
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
#define MAX 256
#define MAXARG 10
int main() {
//variáveis
char comando[MAX];
char *argumentos[MAXARG];
char *pch;
char *arg;
char *retira;
int pid;
int i=0;
int salvaNome = 0;
int eComercial=0;
int entradaSaida;
char *nomeArquivo;
FILE *arq;
while(1){
entradaSaida = 0;
//atribui NULL para o vetor de argumentos;
for(i=0;i<MAXARG;i++)
argumentos[i] = NULL;
i = 1;
printf("> ");
fgets(comando,MAX,stdin);
//retira o \n do final do comando que é feito com o stdin no fgets
retira = strtok(comando,"\n");
strcpy(comando,retira);
if (strcmp(comando," ")){
if (!strcmp(comando, "exit")) {
exit(EXIT_SUCCESS);
}
pch = strtok(comando, " ");
argumentos[0] = pch;
pch = strtok(NULL, " ");
while(pch != NULL){
salvaNome = 0;
arg = pch;
// se o argumento for & a variavel nao passará pelo waitpid depois;
if (!strcmp(arg,"&"))
eComercial = 1;
else{
// se o argumento for > quer dizer que o interpretador deve salvar alguma coisa em um arquivo e, futuramente, abrirá o arquivo passado para escrita("w");
if(pch[0] == '>'){
salvaNome = 1;
entradaSaida = 1;
}
// se o argumento for < quer dizer que o interpretador abrirá um arquivo para leitura("r");
else{
if(pch[0] == '<'){
salvaNome = 1;
entradaSaida = 2;
}
else{
argumentos[i] = arg;
i++;
}
}
}
//armazena o nome do arquivo na variável 'nomeArquivo';
if (salvaNome == 1){
pch = strtok(NULL, " ");
nomeArquivo=pch;
}
pch = strtok(NULL, " ");
}
//executa o fork
pid = fork();
if (pid) {
//caso nao tenha um "&" entre os argumentos ele executa o waitpid();
if (!eComercial)
waitpid(pid, NULL, 0);
}
else {
// se precisar escrever em um arquivo executará aqui
if(entradaSaida==1)
arq = freopen(nomeArquivo, "w", stdout);
// caso contrario executará aqui
if(entradaSaida==2)
arq = freopen(nomeArquivo, "r",stdin);
//finalmente o comando e seus argumentos sao executados pelo execvp
execvp(comando,argumentos);
fclose(stdin);
printf("Erro ao executar comando!\n");
exit(EXIT_FAILURE);
}
}
}
}