Um einen Shell-Befehl interpretor zu realisieren, versuche ich Pipes auszuführen. Um es zu tun, verwende ich eine rekursive Funktion, in der ich die Rohrfunktion und einige Umleitungen mit dup2 verwende. Hier ist mein Code:fork/pipe/close in einer rekursiven Funktion
void test_recurs(pid_t pid, char **ae)
{
char *const arg[2] = {"/bin/ls", NULL};
char *const arg2[3] = {"/bin/wc", NULL};
static int limit = 0;
int check;
int fd[2];
if (limit > 5)
return ;
if (pipe(fd) == -1)
{
printf("pipe failed\n");
return ;
}
pid = fork();
if(pid != 0)
{
printf("père %d\n",getpid());
close(fd[0]);
dup2(fd[1], 1);
close(fd[1]);
if ((execve("/bin/ls", arg, ae)) == -1)
exit(125);
dprintf(2, "execution ls\n");
wait(&check);
}
else
{
printf("fils %d\n", getpid());
close(fd[1]);
dup2(fd[0], 0);
close(fd[0]);
if ((execve("/bin/wc", arg2, ae)) == -1)
printf("echec execve\n");;
dprintf(2, "limit[%d]\n", limit);
limit++;
test_recurs(pid, ae);
}
}
Das Problem ist, es nur „ls | wc“ ausführen eine Zeit und dann auf der Standardeingabe warten. Ich weiß, dass das Problem von den Pipes (und den Umleitungen) kommen kann.
'execve' wird nie zurückkehren. (Nun, ok, es wird zurückkehren, wenn es nicht funktioniert hat.) – user3386109
Es gibt -1 zurück, wenn es nicht funktioniert ja ... – Roozaay