J'essaie de mettre en œuvre une coque Linux qui prend en charge la tuyauterie. J'ai déjà fait des commandes simples, des commandes fonctionnant en arrière-plan, des redirections, mais le piping est toujours manquant.Mise en œuvre de la canalisation
J'ai déjà lu à ce sujet et vu quelques extraits de code, mais je n'ai toujours pas été en mesure de résoudre une solution de travail.
Ce que j'ai jusqu'à présent:
int fd[2];
pipe(fd);
pid_t pid = fork();
if (pid == -1)
return -1;
if (pid == 0)
{
close(fd[1]); //close write to pipe, in child
execlp("cat", "cat", "names.txt", NULL);
}
else
{
close(fd[0]); //close read from pipe, in parent
execlp("sort", "sort", NULL);
}
Je suis un programmeur débutant, comme vous pouvez le dire, et je ne sais pas quand je programmais quelque chose de beaucoup au sujet, ce qui est évidemment le cas, je Je voudrais commencer par quelque chose de vraiment simple et concret, puis construire à partir de là. Donc, avant de pouvoir implémenter trois commandes différentes et plus en pipeline, j'aimerais pouvoir calculer "ls names.txt | sort" ou quelque chose de similaire, dans lequel names.txt est un fichier de noms alfabétiquement non ordonné.
Code mis à jour, mais ne fonctionne toujours pas.
Merci.
Je le savais déjà, j'ai juste oublié d'ajouter l'instruction pipe au code. Que suggérez-vous maintenant? Merci. – nunos
Je pensais que dup2 (0, fd [0]) copiait ce qui était censé aller à stdout à fd [0], qui est l'entrée du processus. Je suppose que ce que je veux, non? – nunos
@nunos: dup2() ne fait pas la copie, il copie * des descripteurs de fichier *. Puisque fd [0] est le fd d'une extrémité de votre nouveau tube, cela n'a pas beaucoup de sens de le fermer, comme le fera dup2(). – unwind