Rediriger stderr stdout

Résolu
Utilisateur anonyme -  
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
Je voudrais rediriger stderr stdout dans une variable en C, le tous sous linux
Mais je ne vois pas tellement par ou commencer , comment procéder et utiliser quel fonction ?
popen() ,freopen(), fork(), pipe()

Enfin voila un peu d'aide serai la bienvenue
Configuration: Linux
Konqueror 3.5

7 réponses

  1. Utilisateur anonyme
     
    Je viens de trouver un document parlant justement de ça.
    je vous le transmet je n'ai pas le temps de regarder sa , je ferais sa ce soir

    http://operatingcomputer.fr/n869.pdf

    rubrique >> 7.19
    1
    1. Utilisateur anonyme
       
      liens mort

      http://www.operatingcomputer.fr/doc/coding/c/n869.pdf
      0
    2. a
       
      Liens mort
      0
  2. Utilisateur anonyme
     
    j'ai trouver avec freopen() ceci :

    #include <stdio.h>
    #include <stdlib.h>

    int main(void)
    {
    FILE *f = freopen("redir.txt","w",stdout) && freopen("redir.txt","w",stderr);

    if(f==NULL)
    return EXIT_FAILURE;

    system("Hello world\n");
    return EXIT_SUCCESS;
    }

    ce qui me permet de rediriger le flux dans redir.txt
    il reste maintenant a rediriger le flux =D dans une variable
    Je pense me tourner vers un pipe() ou quelquechose du même genre
    1
  3. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    Pas évident.
    J'avais essayé à une époque de faire ça, et j'avais vite renoncer, préférant des solutions plus tordu.
    Le plus logique et le plus simple serai de faire :
    stdout=fopen(...);
    Mais je crois que malheuresement ça ne fonctionne pas.

    Je ne voi pas en quoi fork() pourrai t'aider.
    popen() peux être pas mal, en revanche, avec la commande "cat".
    0
  4. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    bien vu !!
    The freopen function
    Synopsis
    1 #include <stdio.h>
    FILE *freopen(const char * filename,
    const char * mode,
    FILE * restrict stream);
    Description
    2 The freopen function opens the file whose name is the string pointed to by filename
    and associates the stream pointed to by stream with it. The mode argument is used just
    as in the fopen function.215)
    3 Iffilename is a null pointer, the freopen function attempts to change the mode of
    the stream to that specified by mode, as if the name of the file currently associated with
    the stream had been used. It is implementation-defined which changes of mode are
    permitted (if any), and under what circumstances.
    4 The freopen function first attempts to close any file that is associated with the specified
    stream. Failure to close the file is ignored. The error and end-of-file indicators for the
    stream are cleared.
    Returns
    5 The freopen function returns a null pointer if the open operation fails. Otherwise,
    freopen returns the value of stream.
    215) The primary use of the freopen function is to change the file associated with a standard text stream
    (stderr, stdin, or stdout), as those identifiers need not be modifiable lvalues to which the value
    returned by the fopen function may be assigned.
    (extrait de la page 276)
    d'après la note de bas de page freopen() sers à faire ça : réorienté les flux.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention   1 526
     
    Sinon, l'idéal c'est de fermer stdout puis d'ouvrir un nouveau fichier.
    Exemple:
    int file;
    close(1);
    file = open("mon_fichier", O_WRONLY);

    En faisant des printf, ça écrira dans le fichier car l'ouverture de ce fichier prend le premier descripteur libre: 1 qui est stdout.

    Au fait c'est pareil avec stdin(descripteur 0) et stderr (descripteur 2).
    0
    1. Utilisateur anonyme
       
      ouai sauf que le but n'est pas d'écrire dans un fichier mais dans une varriable
      0
    2. kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention   1 526 > Utilisateur anonyme
       
      Ah voui j'avais oublié le sujet principal :-D
      Il faut que tu couples ça avec mmap qui te permet de mapper un fichier en mémoire
      http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man2/mmap.2.html

      Même pas besoin de coupler avec ce que j'ai évoqué avant en fait d'ailleurs. Juste utiliser mmap en projetant le descripteur de fichier qu'il faut en mémoire.
      0
    3. Utilisateur anonyme > kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention  
       
      oui mais si on utilise mmap() on est obligé de créer un fichier
      et le but est justement de ne pas créer de fichier

      sinon sa serai trop facile
      =D
      0
    4. kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention   1 526 > Utilisateur anonyme
       
      Non. Tu rediriges stdout: le descripteur 0 en tant que que paramètre fd.
      0
    5. Utilisateur anonyme > kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention  
       
      euh... la pour le mmap je rame
      je vois pas

      un petit exemple serais le bienvenu
      =S
      0
  7. Utilisateur anonyme
     
    sinon pas d'idée ??
    0
  8. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    question con, as tu essayé "fscanf(stdout,"%s",na);" ?
    même si ça ne semble pas possible comme ça.
    ou alors avec reopen() en modifiant les attributs genre :
    reopen(0,"w+",stdout);

    Une autre idée, utilisé les sockets, pas en TCP/IP, mais avec un protocole interne. Je te dit ça, car j'ai vaguement lu un truc dans le genre dans la doc des socket, mais je ne pourai pas en dire plus.
    0