我和一些朋友正在尝试实现一个完整的shell,我负责多管道功能。
问题是在函数结束并返回后,read()
主循环中的 似乎无休止地读取 0 字节并导致无限循环。但是,该函数会输出预期的结果。
在花了大约一周的时间尝试调试我的功能后,我们得出了以下结论:不知何故,我破坏了STDIN
.
什么可能导致这种情况?
为了清楚起见,这是完整的功能减去错误检查。
int do_pipe( t_parser *paser, int fd, t_info *info, int j )
{
int status;
pid_t pid;
int pipefd[ 2 ];
if ( j == 0 )
{
while ( parser->next != NULL )
parser = parser->next;
fd = 1;
}
if ( parser->prev )
pipe( pipefd );
pid = fork();
if ( pid == 0 )
{
if ( parser->prev )
{
close( pipefd[1] );
dup2( pipefd[0], 0 );
close( pipefd[0] );
}
if ( parser->next )
{
if ( parser->prev )
close( pipefd[0] );
dup2( fd, 1 );
close( fd );
}
my_execve( parser, info->env );
}
else
{
if ( parser->prev )
close( pipefd[0] );
if ( fd != 1 )
close( fd );
j++;
if ( parser->prev )
do_pipe( parser->prev, pipefd[1], info, j );
waitpid( pid, &status, 0 );
}
return ( 0 );
}