2017-09-15 2 views
0

Ceci est généralement fait avec des tuyaux. Pipes semblent fonctionner très bien dans les environnements que j'ai testé (et obtenir beaucoup de travail fait en!) Dans Windows 10, plus précisément:Comment diffuser de grandes quantités de données entre les processus dans bash dans Windows?

  • Git bash
  • MSYS2 bash

J'ai trouvé si j'ai un gros fichier ou un flux binaire que je peux utiliser avec précision certains des outils installés (cat largefile.JPG | wc -c), mais chaque fois que j'écris mes propres programmes de traitement d'image avec C++, quelle que soit la méthode avec cstdio old school C méthodes, avec un programme C, ou avec C++ cin iostreams) Je n'obtiens qu'une petite fraction du flux avant qu'elle ne se termine. La longueur de celui-ci semble être déterministe, donc le même fichier produit le même résultat.

Tester le même code sur OS X ou Linux conduit évidemment à un fonctionnement correct où la longueur du flux stdin est la bonne longueur. De ce fait, cela est pratique sur ces plates-formes pour transmettre des données sans toucher le disque. Je perfectionnais mon bash-fu depuis une dizaine d'années, donc ça se fait naturellement.

Bien sûr, il existe d'autres méthodes que je peux exploiter, mais je ne peux pas vraiment trouver quelque chose rapidement sur lequel je peux compter. Quelles sont les choses que je pourrais essayer de résoudre ce problème ici? J'aime vraiment l'ensemble des outils unix je peux installer avec pacman à l'intérieur MSYS2, y compris

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

Mais ceci est mon un gros bloc d'achoppement jusqu'à présent. Mon programme le plus simple compilé avec ce compilateur est incapable d'extraire une quantité utile de données du flux d'entrée standard. Pourquoi donc? Si c'est une limitation du système d'exploitation, ou de la couche posix et de toute cette magie noire, alors pourquoi fonctionne-t-il parfaitement? wc

+1

Veuillez montrer votre programme exécutable le plus simple, compilable, qui ne parvient pas à lire tout le 'stdin' et comment vous l'exécutez. –

+0

J'ai utilisé le code [this] (https://stackoverflow.com/a/3495410/340947), et lancez-le comme ceci: 'cat large.JPG | ./taille'. Il est compilé avec 'gcc size.c -o size'. –

+0

Avez-vous regardé https://github.com/borgbackup/borg/pull/2032? – zortacon

Répondre

0

Ctrl + Z signale EOF sous Windows, et je ne le savais pas.

Merci à Alf pour le commentaire avec cette réponse. Si vous postez une réponse je vais changer l'acceptation.

1

Pas vraiment une réponse, juste une astuce pour aider à travailler dehors ...

Comme vous l'avez déjà graphicsmagick, vous pouvez créer des fichiers de longueur arbitraire et le contenu très facilement pour les tests.

Ainsi, un fichier 64Ko plein de hex 27:

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

Ou, un fichier 32kB PGM de zéros:

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

Ou, un fichier avec toutes les valeurs hexagonales entre 0x0 et 0xff :

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 /:;<=> 
00000040: 3f40 4142 4344 4546 4748 494a 4b4c 4d4e [email protected] 
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 ................