J'ai réellement une solution em> à ce problème, mais je me demande s'il y a un slicker un. J'ai la nécessité de charger une bibliothèque à mon utilitaire à l'aide de Malheureusement, la fonction spews tout un tas d'informations sur stdout et cela je ne veux pas. P> J'ai un Solution non portable et je me demande s'il y a une solution meilleure et plus générique que je pourrais utiliser. P> Voici ce que j'ai ( dlopen code> puis appelez l'une des fonctions. P>
/*
* Structure for retaining information about a stream, sufficient to
* recreate that stream later on
*/
struct stream_info {
int fd;
fpos_t pos;
};
#define STDOUT_INFO 0
#define STDERR_INFO 1
struct stream_info s_info[2];
point_stream_to_null(stdout, &s_info[STDOUT_INFO]);
point_stream_to_null(stderr, &s_info[STDERR_INFO]);
void *output = noisy_function();
reset_stream(stderr, &s_info[STDERR_INFO]);
reset_stream(stdout, &s_info[STDOUT_INFO]);
/*
* Redirects a stream to null and retains sufficient information to restore the stream to its original location
*** NB ***
* Not Portable
*/
void point_stream_to_null(FILE *stream, struct stream_info *info) {
fflush(stream);
fgetpos(stream, &(info->pos));
info->fd = dup(fileno(stream));
freopen("/dev/null", "w", stream);
}
/*
* Resets a stream to its original location using the info provided
*/
void reset_stream(FILE *stream, struct stream_info *info) {
fflush(stream);
dup2(info->fd, fileno(stream));
close(info->fd);
clearerr(stream);
fsetpos(stream, &(info->pos));
}
5 Réponses :
dans Windows, vous pouvez également rediriger des flux. Voir http://support.microsoft.com/kb/110930/fr-US p>
Ces redirections sont des redirections shell. En conséquence, cela ne fait rien pour séparer ma sortie souhaitée de la malbouffe indésirable que la fonction de la bibliothèque génère
Malheureusement, le libération d'un nom de fichier NULL spécifique à la plate-forme est à peu près le plus proche que vous puissiez entrer dans Standard C. Vous pouvez également envisager de modifier la bibliothèque elle-même pour ne pas cracher de nombreuses sorties sur stdout. P>
Cela dit, dans la pratique, les seuls systèmes d'exploitation que vous devez vous inquiéter sont soit basé sur UNIX (y compris MacOS), soit Windows - dans le cas de Windows, STDOUT est masqué par défaut, vous pouvez donc simplement ignorer l'étape de redirection, et pour * Nix, vous avez déjà le code. P>
Pouvez-vous clarifier 'stdout est caché par défaut'? Où est-ce que PrintF est dirigé dans ce cas?
À moins que vous n'ayez un débogueur attaché ou que quelqu'un passe à la peine de fixer autrement à votre stdout ou que vous initialisez une console, dans une application de sous-système Win32, rien envoyé à STDOUT est supprimée par défaut.
Compris. Cependant, l'utilitaire est exécuté à partir de l'invite de commande, nous avons donc toujours une console attachée à stdout.
Vous pouvez essayer d'utiliser Une autre façon serait de rediriger le stdouté dans un fichier temporaire, comme avec cette fonction macro. P> SETVBUF code> pour définir
stdout code> pour avoir un très grand tampon et être complètement tamponné. Ensuite, après chaque appel à
noisy_function code>, effacez le tampon avant de le rincer au flux. Je pense que cela invoque cependant de comportement non défini.
J'ai une suggestion, ce qui vous permet d'utiliser le préprocesseur de portabilité, ou peut-être "portabilité".
Si vous essayez quelque chose comme p> (Ignorer les autres OSES , sinon cas, directive d'erreur, etc.)
puis rouvrir le fichier comme avant p> alors cela peut vous donner ce que vous voulez. p> Je n'ai pas essayé ceci à la maison, cependant. Le fichier "nul" existe; Voir / dev / null dans Windows . Et vous pouvez obtenir des macros prédéfinies à "Macros de compilateur C / C ++ pré-défini" . P> p>
Merci JXG: C'est le plus proche que je suis arrivé à une réponse portable ... je vais prendre "portable" n'importe quand tous les jours :)
Pour les applications de la console Windows:
freopen("NUL", "w", stdout); // redirect stdout to the windows version of /dev/null NoisyDllFunction(); freopen("CON", "w", stdout); // redirect stdout back to the console
Vous recherchez une solution portable. Ce que j'ai c'est très bien pour Unix.