2017-02-10 3 views
-1

Ce code prend 2 fichiers et place les résultats dans un troisième fichier. Cela fonctionne très bien, mais ce qui m'inquiète, c'est que le dernier printf n'imprime pas à l'écran. Le premier imprime très bien. Cela me dit que je n'ai pas restauré la sortie stdout correctement?Ne pas récupérer stdout

int main (int argc, char *argv[]) 
{ 
    char *join[4]={"cat", "file1.txt","file2.txt", 0}; 
    int id, fd, status; 

    printf("fd=%d\n", fd); //this one prints to screen 

    fd=dup(1); //save stdout 
    close(1); close stdout 

    FILE *out=fopen("output.c", "a"); //this is where the output should go 

    id=fork(); //0 for child 

    if (id>0) //parent process 
    { 
     waitpid(id, &status, WUNTRACED); 
    } 

    else if (id==0) //child process 
    { 
     execvp(join[0], join); 
    } 

    else //error 
    { 
     printf("error occured"); 
    } 


    close(1); 
    dup2(fd, 1); 
    fclose(out); 


    printf("fd=%d\n", fd); //this one doesn't print to screen 


return 0; 

} 
+1

'fd' ne reçoit jamais de valeur, donc vous mettez une valeur indéfinie dans les fichiers de données. Après la fermeture, vous n'essayez jamais de restaurer la sortie d'origine, alors pourquoi voudriez-vous que cela fonctionne magiquement? – John3136

+0

Votre code squelettique manque pas mal d'étapes importantes. Ce n'est pas un MCVE ([MCVE]), mais nous pouvons, à peu près, déterminer ce que vous faites et remplir les espaces vides. Il vaut mieux ne pas deviner et grimacer ce qui n'est pas fait (initialiser 'fd', par exemple, ou se demander quelle est la signification de' out'), et espérer le meilleur. –

+0

Désolé, toujours nouveau pour cela. J'ai fait quelques modifications et je ne vois toujours pas la deuxième déclaration d'impression et maintenant je ne peux pas voir ce que je tape dans le terminal maintenant. Je pensais que j'ai restauré la sortie avec 'dup2 (fd, 1)'? –

Répondre

3

Vous devez enregistrer stdout afin que vous puissiez le récupérer plus tard.

// save stdout 
int sv_stdout = dup(STDOUT_FILENO); 
// close stdout 
close(STDOUT_FILENO); 

// do stuff 

// restore stdout 
dup2(sv_stdout, STDOUT_FILENO); 
0

execvp ne retourne jamais. Votre processus est remplacé par le processus cat. Lorsque ce processus se termine, vous obtenez votre invite de shell. Voir la page man pour exec. Google un exemple de fork/exec pour voir comment exécuter plusieurs processus. Ou utilisez system() qui le fait pour vous.