J'utilise le code suivant pour rediriger stdout vers un canal, puis lire toutes les données du canal dans un tampon. J'ai 2 problèmes:Comment empêcher le débordement de tampon en C/C++?
premier problème: quand j'envoie une chaîne (après redirection) plus grande que BUFF_SIZE du tuyau, le programme cesse de répondre (blocage ou quelque chose).
deuxième problème: lorsque j'essaie de lire à partir d'un tuyau avant que quelque chose a été envoyé à stdout. Je reçois la même réponse, le programme cesse de répondre - _read commande coincé ...
Le problème est que je ne connais pas la quantité de données qui seront envoyées au tuyau après la redirection.
Le premier problème, je ne sais pas comment gérer et je serai heureux de vous aider. Le deuxième problème que j'ai résolu par une solution de contournement simple, juste après la redirection, j'imprime le caractère d'espace à stdout. mais je suppose que cette solution est la bonne ... un
#include <fcntl.h>
#include <io.h>
#include <iostream>
#define READ 0
#define WRITE 1
#define BUFF_SIZE 5
using namespace std;
int main()
{
int stdout_pipe[2];
int saved_stdout;
saved_stdout = _dup(_fileno(stdout)); // save stdout
if(_pipe(stdout_pipe,BUFF_SIZE, O_TEXT) != 0) // make a pipe
{
exit(1);
}
fflush(stdout);
if(_dup2(stdout_pipe[1], _fileno(stdout)) != 0) //redirect stdout to the pipe
{
exit(1);
}
ios::sync_with_stdio();
setvbuf(stdout, NULL, _IONBF, 0);
//anything sent to stdout goes now to the pipe
//printf(" ");//workaround for the second problem
printf("123456");//first problem
char buffer[BUFF_SIZE] = {0};
int nOutRead = 0;
nOutRead = _read(stdout_pipe[READ], buffer, BUFF_SIZE); //second problem
buffer[nOutRead] = '\0';
// reconnect stdout
if (_dup2(saved_stdout, _fileno(stdout)) != 0)
{
exit(1);
}
ios::sync_with_stdio();
printf("buffer: %s\n", buffer);
}
Pourquoi la taille de votre tampon est-elle si petite? – JimR
Pour éviter le dépassement de la mémoire tampon, n'écrivez pas à la fin de la mémoire tampon. – user562374
le tampon est petit seulement pour cet exemple ...J'utilise un gros buffer mais je cherche une technique pour avoir un buffer moyen et en besoin (quand il est débordé) pour l'agrandir ... – alexpov