我刚刚完成了我的shell解释器,但是我认为我的管道实现有问题。
它能够工作,像ls | cat -e
这样的基本操作可以正常运行,但是如果文件描述符超过60ko,我担心会出现分段错误
的可能性。
当我对一个长于60ko的文件进行cat操作时,我发现还有一个无限循环。例如,如果我执行foo | cat -e
,其中foo是一个长文件,就会发生无限循环。
还有其他例子,比如当我执行cat /dev/urandom | cat -e
时,它不会显示任何内容,因此它首先执行cat /dev/urandom
,然后执行cat -e
。
这是我的代码:
int son(int *fd_in, int p[2], t_list *cmd, char **env)
{
(void)env;
dup2(*fd_in, 0);
if (cmd->act != ENDACT && cmd->act != LEFT && cmd->act != DLEFT)
dup2(p[1], 1);
close(p[0]);
execve(cmd->av[0], cmd->av, NULL);
return (-1);
}
t_list *execute_pipe(t_list *cmd, int *fd_in)
{
int p[2];
pid_t pid;
*fd_in = 0;
while (cmd->act != -1)
{
pipe(p);
if ((pid = fork()) == -1)
return (NULL);
else if (pid == 0)
son(fd_in, p, cmd, NULL);
else
{
wait(NULL);
close(p[1]);
*fd_in = p[0];
if (cmd->act != PIPE)
return (cmd);
cmd = cmd->next;
}
}
return (cmd);
}