有些朋友和我正在尝试实现一个完整的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 );
}