1

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

0 回答 0