poll() 和 EOF:重定向文件描述符并进行过滤

Posted

技术标签:

【中文标题】poll() 和 EOF:重定向文件描述符并进行过滤【英文标题】:poll() and EOF: redirect file descriptors and do filtering 【发布时间】:2021-03-16 05:34:29 【问题描述】:

在 Linux/SunOS/AIX 上,假设 PARENT_READ_FD 代表父进程的标准输出,而 WRITE_FD 代表当前进程的标准输入,您是否知道“重定向”父进程的输出的不同/更好的方法进程到当前进程并应用过滤(ebcdic->utf8),直到基本上没有其他可读取的内容?

下面的工作代码:

void redirect() 
  char tmp[1];
  while (read(PARENT_READ_FD, tmp, 1)) 
    // filter/convert tmp here [code section omitted for clarity]
    write(WRITE_FD, tmp, 1);
    if (poll(&(struct pollfd)  .fd = PARENT_READ_FD, .events = POLLIN , 1, 0) == 0) break;
  

感谢您的关注

【问题讨论】:

您可以省略 poll 部分,而是检查 read 和 write(和 errno)的返回值。还可以按块读取(比如 64KB)而不是按字节读取。 (您仍然可以转换数据,读取大小与它无关。) 【参考方案1】:

不是一次只读取一个字节,而是读取整个管道缓冲区大小的数据(查看特定的操作系统手册以找出数字或系统调用)。在 Linux 中,这个数字现在是动态的,取决于文件描述符;您可以使用fcntl(fd, F_GETPIPE_SZ); 找到大小 - 如果出现此错误,您会默认使用一些保守的估计值,例如 65536...

【讨论】:

上面的代码中没有显示,但是内容会即时修改。否则,是的,只是 pipe()。 @JeromeIbanes 在这种情况下确实将其添加到问题中。这些是重要的细节,即“我正在做一个过滤器” 如果使用 fcntl(fd, F_GETPIPE_SZ);我应该使 read() 非阻塞吗?

以上是关于poll() 和 EOF:重定向文件描述符并进行过滤的主要内容,如果未能解决你的问题,请参考以下文章

在centos系统shell脚本中cat和重定向符号<<EOF结合使用的注意事项

shell 重定向输入

3输入输出重定向bash算术正则表达式 学习笔记

文件查找

在 Bash vs ZSH 中结合 heredoc 和输入重定向

linux基础学习-10.1-特殊符号-分类讲解