无法从重定向的 io 中读取数据

标签 c linux fork pipe stdout

我编写了一段相对简单的代码来轮询在子进程中重定向为标准输出的管道。但是当 poll 函数返回并表示数据已准备好时,read 函数总是返回零。

关于为什么这不起作用,有什么突出的原因吗?当我直接写入从子进程到父进程的管道时,它工作正常。我想我只是错误地重定向了 io。

这是父进程代码:

注意:所有宏都会解释错误并将它们打印到错误日志中。

pollData.fd = out.fd[ READ_INDEX ];
pollData.events = POLL_IN;
pollData.revents = 0;

printf( "Polling pipe for data...\n" );

if( poll( &pollData, 1, 5000 ) > 0 )
{
        int bytesRead = 0, trys = TRYS;
        printf( "Data has been received: " );

        Read:

        bytesRead = read( out.fd[ READ_INDEX ] , out.buf, BUF_SIZE );

             if( bytesRead > 0 ) printf( "%s" , out.buf );
        else if( bytesRead < 0 ) printf( "Error receiving data.\n" );
        else
        {
                trys--;
                printf( "No data was read.\n" );
                sleep( SLEEP );
                if( trys > 0 ) goto Read;
        }
}
else LOG( ERR_POLLING, 0 );

这是子进程代码: 注意:FD_REPLACE 使用 dup2 并关闭旧句柄。

FD_CLOSE_PACK(  out.fd[  READ_INDEX ],
                err.fd[  READ_INDEX ],
                 in.fd[ WRITE_INDEX ] );

FD_REPLACE( fileno( stdout ) , out.fd[ WRITE_INDEX ] , Child_Fail );
FD_REPLACE( fileno( stderr ) , err.fd[ WRITE_INDEX ] , Child_Fail );
FD_REPLACE( fileno( stdin  ) ,  in.fd[  READ_INDEX ] , Child_Fail );

printf( "This is a message from the test program!\n Hope it works!\n" );

sleep( 10 );

Child_Fail:

FD_CLOSE_PACK(  out.fd[ WRITE_INDEX  ],
                err.fd[ WRITE_INDEX  ],
                 in.fd[  READ_INDEX  ] );
return -1;

这是其中一个宏:

#define FD_REPLACE( old_fd, fd , addr )        
if( dup2( old_fd, fd ) < 0 )                                          
{ 
        LOG( ERR_DUP2, #old_fd " with " #fd );                 
        goto addr;           
}        

这是终端的输出:

Polling pipe for data...
Data has been received: No data was read.
No data was read.
No data was read.
No data was read.
No data was read.

Now closing...

最佳答案

我成功了。我错误地替换了文件描述符。我替换了错误的描述符,并且在关闭旧描述符之前就这样做了。我上面发布的代码显示了旧的宏。新宏是(没有错误检查):

#define FD_REPLACE( old_fd, fd, addr )
close( old_fd );
dup2( fd, old_fd );

关于无法从重定向的 io 中读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15540023/

相关文章:

c - Windows编程中关于 "ScrollWindow"API函数第四个参数的困惑

c - 为什么清除变量后会丢失数据

linux - 如何确保 Ubuntu 中文件复制的完整性

c - 不共享相同数据的并行进程

c - 从数据流 : 中选择前 k 个(百分比)项目的有效算法

有人可以解释一下这种递归是如何工作的吗?

linux - Bash 重定向与管道

linux - shell 必须解析 ls -Al 输出并获取最后一个字段(文件或目录名)任何解决方案

c++ - 开始 pty 询问登录凭据

c - 使用 execv 启动程序并传递参数而不引发 argc