Essayer de mettre en place une coque, principalement de la tuyauterie. J'ai écrit ce cas de test dont je m'attends à simplement ls à wc ... ça ne marche vraiment pas comme prévu. Il imprime ls sur le terminal puis imprime la mémoire épuisée. Je suis très perdu dans la façon de résoudre ce problème et de le faire fonctionner. find_path fonctionne dans tous mes tests. Editer - Je dois utiliser execv pour le projet, c'est une chose de classe, mais je l'ai essayé avec execvp juste au cas où il ferait exactement la même chose. Aussi ce n'est qu'un exemple, un test pour voir pourquoi ça ne marche pas, j'appelle fork deux fois pour les deux commandes et waitpid car je n'ai rien d'autre à faire.C Unix Pipes Exemple
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
int find_path(char* execname, char** dst)
{
char *path = getenv("PATH");
path = strdup(path);
char *pos;
path = strtok_r(path, ":", &pos);
char *originalpath = path;
do
{
char* test = (char*)calloc(strlen(path) + strlen(execname) + 2, sizeof(char));
test = strcpy(test, path);
int testlen = strlen(test);
(*(test+testlen)) = '/';
strcpy(test + testlen + 1,execname);
struct stat buf;
int result = stat(test, &buf);
if (result == 0)
{
*dst = test;
free (originalpath);
return 1;
}
else
{
free(test);
}
} while ((path = strtok_r(NULL, ":", &pos)) != NULL);
free(originalpath);
return 0;
}
int main()
{
char *cmd1 = "ls";
char *cmd2 = "wc";
int filedes[2];
pipe(filedes);
char** argv = (char**)calloc(1, sizeof(char*));
argv[0] = (char*)malloc(sizeof(char*));
argv[0] = NULL;
pid_t pid = fork();
if (pid == 0)
{
char *path;
find_path(cmd1, &path);
dup2(filedes[1],stdout);
execv(path,argv);
}
pid = fork();
if (pid == 0)
{
dup2(filedes[0], stdin);
char *path;
find_path(cmd2, &path);
execv(path, argv);
}
else
waitpid(pid);
}
Avez-vous regardé la course de l'an dernier "Comment implémenter un shell avec des questions ... fork ... pipe ... exec ..."? La réponse est probablement dans un (plus probablement beaucoup) de ceux. –