2017-03-04 8 views
0

J'essayais dup2 sur linux. Mon programme de test est: J'ouvre un tube, j'essaie de copier stdin à fifo write, dup stdout à fifo read, je souhaite quand je lance ce programme, stdin est écrit dans le fifo, et fifo télécharge automatiquement le contenu sur stdout:linux dup2 ne semble pas fonctionner avec des tuyaux?

J'ai exécuté ce programme, n'a pas vu une impression stdout supplémentaire.
#include<stdio.h> 
#include<unistd.h> 
int main(){ 
    int pipefd[2]; 
    pipe(pipefd); 
    int& readfd=pipefd[0]; 
    int& writefd=pipefd[1]; 
    dup2(STDIN_FILENO,writefd); 
    dup2(STDOUT_FILENO,readfd); 

    char buf[1024]; 
    scanf("%s",buf); 
    return 0; 
} 

Ma question:

(1) Est-ce que mon stdin "scanf" est écrit à fifo writefd? (2) Si oui, le contenu peut-il être dirigé automatiquement vers la sortie de ma console? Si ce n'est pas comment le réparer?

Répondre

1

Si je reçois man dup2 droit, l'appel système dup2(oldfd, newfd) crée une copie du descripteur de fichier oldfd numéroté newfd, fermeture en silence newfd si elle était auparavant ouverte. Ainsi, votre ligne dup2(STDIN_FILENO,writefd) ferme l'extrémité d'écriture du canal et la remplace par une copie de stdin. La ligne suivante fait la même chose pour la fin de lecture et la sortie standard, respectivement. Donc, vous n'obtenez pas votre stdin et stdout connecté via un tuyau. Au lieu de cela, vous créez un canal, puis fermez ses deux extrémités et les remplacez par des copies de vos descripteurs stdin et stdout d'origine. Après que votre scanf("%s",buf); lit juste une chaîne du stdin original comme d'habitude. Vous pouvez ajouter une ligne comme printf("%c\n", buf[1]) juste après cela, et il imprimera le deuxième caractère de la chaîne à la sortie d'origine. Notez qu'à ce point, en fait il n'y a pas de pipe créée avec pipe(pipefd) — ses deux extrémités étaient déjà fermées.