【问题标题】:How to stream large quantities of data between processes in bash in windows?如何在 Windows 中的 bash 进程之间传输大量数据?
【发布时间】:2018-02-24 06:53:01
【问题描述】:

这通常通过管道完成。管道 似乎 在我一直在 Windows 10 中测试(并完成大量工作!)的环境中工作正常,特别是:

  • Git 重击
  • MSYS2 bash

我发现如果我有一个大文件或二进制流,我可以准确地使用一些已安装的工具 (cat largefile.JPG | wc -c),但是每当我用 C++ 编写自己的图像处理程序时,无论我用什么方法来阅读标准输入(无论是使用 cstdio 老式 C 方法、使用 C 程序还是使用 C++ cin iostreams)我只得到一小部分流在结束之前出现。它的长度似乎是确定性的,所以同一个文件会产生相同的结果。

在 OS X 或 Linux 上测试相同的代码显然可以正常运行,其中标准输入流的长度是正确的长度。因此,这在这些平台上成为一种实用的方法,可以在不影响磁盘的情况下传递数据。十年来我一直在磨练我的 bash-fu,所以它很自然。

当然,必须存在其他我可以利用的方法,但我无法真正快速想出我可以依赖的东西。我可以在这里尝试解决哪些问题?我真的很喜欢我可以在 MSYS2 中使用 pacman 安装的一组 unix 工具,包括

g++.exe (Rev2, Built by MSYS2 project) 7.1.0
Copyright (C) 2017 Free Software Foundation, Inc.

但到目前为止,这是我的一大绊脚石。我用这个编译器编译的最简单的程序无法从标准输入流中获取大量有用的数据。这是为什么?如果是操作系统或 posix 层以及所有这些黑魔法的限制,那么为什么 wc 可以完美运行?

【问题讨论】:

  • 请展示你最简单、可编译、可运行但无法读取所有stdin的程序,以及你是如何运行它的。
  • 我使用了this 代码,并像这样运行它:cat large.JPG | ./size。它是用gcc size.c -o size编译的。
  • 您需要以二进制模式读取流。在 Windows 中,字节值 26 (Ctrl Z) 表示文本模式的 EOF,至少如果它单独出现在一行上。也就是说,内存映射文件似乎比复制大量数据更有效。
  • 基于 Cheers 的评论,这里有一些关于将 std::cin 作为二进制打开的想法:stackoverflow.com/questions/7587595/…
  • _setmode(_fileno(stdin), _O_BINARY); 似乎是诀窍。

标签: c++ windows shell stream pipe


【解决方案1】:

Ctrl+Z 在 Windows 中发出 EOF 信号,而我没有意识到这一点。

感谢 Alf 对此答案的评论。如果您发布答案,我将切换接受。

【讨论】:

    【解决方案2】:

    不是真正的答案,只是帮助解决问题的提示......

    由于您已经拥有 Graphicsmagick,因此您可以非常轻松地创建具有任意长度和内容的文件以进行测试。

    所以,一个 64kB 的文件充满了十六进制 27:

    gm convert -depth 8 -size 64x1024 xc:"#272727" gray:- | wc -c
    

    或者,一个 32kB 零的 PGM 文件:

    gm convert -depth 8 -size 32x1024 xc:"#000" PGM:-
    

    或者,所有十六进制值都在0x00xff 之间的文件:

    gm convert -depth 8 -size 1x256 gradient:black-white gray:- | xxd 
    
    00000000: 0000 0102 0304 0506 0708 090a 0b0c 0d0e  ................
    00000010: 0f10 1112 1314 1516 1718 191a 1b1c 1d1e  ................
    00000020: 1f20 2122 2324 2526 2728 292a 2b2c 2d2e  . !"#$%&'()*+,-.
    00000030: 2f30 3132 3334 3536 3738 393a 3b3c 3d3e  /0123456789:;<=>
    00000040: 3f40 4142 4344 4546 4748 494a 4b4c 4d4e  ?@ABCDEFGHIJKLMN
    00000050: 4f50 5152 5354 5556 5758 595a 5b5c 5d5e  OPQRSTUVWXYZ[\]^
    00000060: 5f60 6162 6364 6566 6768 696a 6b6c 6d6e  _`abcdefghijklmn
    00000070: 6f70 7172 7374 7576 7778 797a 7b7c 7d7e  opqrstuvwxyz{|}~
    00000080: 7f80 8182 8384 8586 8788 898a 8b8c 8d8e  ................
    00000090: 8f90 9192 9394 9596 9798 999a 9b9c 9d9e  ................
    000000a0: 9fa0 a1a2 a3a4 a5a6 a7a8 a9aa abac adae  ................
    000000b0: afb0 b1b2 b3b4 b5b6 b7b8 b9ba bbbc bdbe  ................
    000000c0: bfc0 c1c2 c3c4 c5c6 c7c8 c9ca cbcc cdce  ................
    000000d0: cfd0 d1d2 d3d4 d5d6 d7d8 d9da dbdc ddde  ................
    000000e0: dfe0 e1e2 e3e4 e5e6 e7e8 e9ea ebec edee  ................
    000000f0: eff0 f1f2 f3f4 f5f6 f7f8 f9fa fbfc fdfe  ................
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      • 2020-07-30
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-21
      相关资源
      最近更新 更多