Je suis en train de réécrire un shell basique avec la prise en compte de redirections et de pipes.
Le fonctionnement du programme doit être basé sur bash mais j’ai un peu de mal à implémenter le fonctionnement suivant :
echo a > file | cat
Dans ce cas de figure bash écrira 'a' dans file et cat n'écrira rien sur le stdout.
De ce que je comprends, le pipe dans le cas actuel ne sert à rien vu que echo est redirigé vers file. Inutile donc d'utiliser la fonction pipe(), je peux directement exécuter la fonction cat. Le problème que je rencontre c’est qu’en l’état, cat attend une entrée sur le stdin et ne retourne donc pas tant que je n’envoie pas le EOF. Fonctionnement standard de cat sans arguments donc alors que sous bash cat retourne directement.
Voici un petit exemple de code pour tester le fonctionnement :
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(void) {
char const *c1[] = {"/bin/echo", "a", NULL};
char const *c2[] = {"/bin/cat", NULL};
int fd[2];
int pid;
int openfd;
pid = fork();
if (pid == 0)
{
openfd = open("file", O_RDWR | O_CREAT, 0644);
dup2(openfd, 1);
execve(c1[0], (char * const*) c1, NULL);
}
pid = fork();
if (pid == 0)
{
execve(c2[0], (char * const*) c2, NULL);
}
for (int i = 0; i < 2; i++)
wait(NULL);
return (0);
}
Avez-vous une idée de comment je pourrais gérer ce cas de figure ?
une idée simple serait de compter les arguments dans ton cas pas d'argument donc return 0
mais si tu dois recréer un shell, ça veut dire que tu dois prendre les param depuis une saisie clavier, non ? je te dis ça cat pour moi ton programme ne fait pas :
echo a > file | cat
mais plutot
echo a > ; cat
dans ton cas tu ne redirige pas du tout la sortie de `echo a > file` dans `cat` et c'est pour ça que ça ne marche pas
- Edité par ox223252 5 octobre 2021 à 11:28:12
la connaissance est une chose qui ne nous appauvrit pas quand on la partage.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
la connaissance est une chose qui ne nous appauvrit pas quand on la partage.
Mon GitHub