Possibilité de taper des commandes seules sans pipe

This commit is contained in:
rick 2021-02-16 19:20:17 +01:00
parent 9b73b654b0
commit 4e372b9223
Signed by: Rick
GPG key ID: 2B593F087240EE99
2 changed files with 32 additions and 113 deletions

View file

@ -1,89 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#define MAX_LENGTH 200
char** u_get_input(char* buffer, char* user_input, int i);
int main()
{
char *buffer = (char *) malloc(MAX_LENGTH);
char *user_input1 = (char *) malloc(MAX_LENGTH);
char *user_input2 = (char *) malloc(MAX_LENGTH);
int pid1, pid2;
int my_pipe[2];
int t = pipe(my_pipe);
if (t == -1)
{
printf("erreur à la création du pipe");
return 1;
}
char **args1 = u_get_input(buffer, user_input1, 1);
char **args2 = NULL;
while (strcmp(user_input1, "exit") != 0)
{
args2 = u_get_input(buffer, user_input2, 2);
pid1 = fork();
if (!pid1)
{
dup2(my_pipe[1], STDOUT_FILENO);
close(my_pipe[0]);
close(my_pipe[1]);
execvp(user_input1, args1);
return 0;
}
else {
pid2 = fork();
if (!pid2)
{
dup2(my_pipe[0], STDIN_FILENO);
close(my_pipe[1]);
close(my_pipe[0]);
execvp(user_input2, args2);
return 0;
}
else
{
close(my_pipe[0]);
close(my_pipe[1]);
waitpid(pid2, NULL, 0);
}
}
free(args1);
free(args2);
args1 = u_get_input(buffer, user_input1, 1);
pipe(my_pipe);
}
free(args1);
free(buffer);
free(user_input1);
free(user_input2);
return 0;
}
char** u_get_input(char* buffer, char* user_input, int j)
{
printf("\ncommande%d> ", j);
memset(buffer, 0, MAX_LENGTH);
memset(user_input, 0, MAX_LENGTH);
fgets(buffer, MAX_LENGTH, stdin);
strncpy(user_input, buffer, strlen(buffer)-1);
char *token = strtok(user_input, " ");
char **args = (char **) malloc(MAX_LENGTH);
int i = 0;
while (token != NULL && i < MAX_LENGTH)
{
args[i] = token;
i++;
token = strtok(NULL, " ");
}
return args;
}

View file

@ -1,12 +1,17 @@
/**
* @file shellOpt.c
* @author rick <rick@gnous.eu>
* @date 2021
*/
#include "parser.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <sys/wait.h> #include <sys/wait.h>
#include "parser.h"
int main() int main()
{ {
int pid; int pid;
@ -51,8 +56,6 @@ int main()
int index = 0; int index = 0;
while (strcmp(args[0], "exit")) while (strcmp(args[0], "exit"))
{
if (args[1] != NULL)
{ {
while (args[index] != NULL) while (args[index] != NULL)
{ {
@ -60,6 +63,8 @@ int main()
if (!pid) if (!pid)
{ {
tok_space(args[index], command); tok_space(args[index], command);
if (args[1] != NULL)
{
if (args[index+1] == NULL) if (args[index+1] == NULL)
dup2(my_pipe[0], STDIN_FILENO); dup2(my_pipe[0], STDIN_FILENO);
else if (index == 0) else if (index == 0)
@ -68,9 +73,10 @@ int main()
dup2(my_pipe[0], STDIN_FILENO); dup2(my_pipe[0], STDIN_FILENO);
dup2(my_pipe[1], STDOUT_FILENO); dup2(my_pipe[1], STDOUT_FILENO);
}*/ }*/
close(my_pipe[0]); close(my_pipe[0]);
close(my_pipe[1]); close(my_pipe[1]);
}
execvp(command[0], command); execvp(command[0], command);
return 0; return 0;
} }
@ -87,7 +93,6 @@ int main()
index++; index++;
} }
} }
}
for (int i = 0; i < MAX_LENGTH; i++) for (int i = 0; i < MAX_LENGTH; i++)
{ {
@ -97,7 +102,11 @@ int main()
command[i] = (char *) calloc(MAX_LENGTH, sizeof(char)); command[i] = (char *) calloc(MAX_LENGTH, sizeof(char));
} }
parse_char(args, '|'); parse_char(args, '|');
pipe(my_pipe); if (pipe(my_pipe) == -1)
{
printf("erreur sur le pipe");
return 1;
}
index = 0; index = 0;
} }
@ -108,4 +117,3 @@ int main()
} }
return 0; return 0;
} }