2010-05-10 4 views
0

Je suis en train de faire un cours sur les systèmes d'exploitation et nous sommes supposés apprendre à utiliser les tuyaux pour transférer des données entre les processus.Utilisation de tuyaux sous Linux avec C

On nous a donné ce simple code qui montre comment utiliser les tuyaux, mais j'ai du mal à le comprendre.

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

main() 
{ 
     int pipefd [2], n; 
     char buff[100] ; 


     if(pipe(pipefd) < 0) 
     { 
     printf("can not create pipe \n"); 
     } 
     printf("read fd = %d, write fd = %d \n", pipefd[0], pipefd[1]); 
     if (write (pipefd[1],"hello world\n", 12)!= 12) 
     { 
     printf("pipe write error \n"); 
     } 
     if( (n = read (pipefd[0] , buff, sizeof (buff) )) <= 0) 
     { 
     printf("pipe read error \n"); 
     } 
     write (1, buff, n) ; 
exit (0); 
    } 

Que fait la fonction d'écriture? Il semble envoyer des données à la pipe et aussi l'imprimer à l'écran (au moins il semble que la fonction d'écriture est appelée pour la deuxième fois).

Quelqu'un at-il des suggestions de bons sites Web pour en apprendre davantage sur des sujets tels que celui-ci, FIFO, les signaux, d'autres commandes linux de base utilisés dans C?

Répondre

3

La fonction crée un tube et stocke ses descripteurs de fichier endpoing dans pipefd[0] et pipefd[1]. Tout ce que vous écrivez à une extrémité peut être lu par l'autre et vice versa. Le premier appel write() écrit "bonjour monde" à pipefd[1], et l'appel read() lit les mêmes données de pipefd[0]. Ensuite, le deuxième appel write() écrit ces données dans le descripteur de fichier 1, qui est STDOUT par défaut, ce qui explique pourquoi vous le voyez à l'écran.

Les tuyaux peuvent être déroutants au début. À mesure que vous lisez/écrivez plus de code qui les utilise, ils deviennent beaucoup plus faciles à comprendre. Je recommande W. Richard Stevens Programmation avancée dans l'environnement UNIX comme un bon livre pour les comprendre. Si je me souviens, il a de bons exemples de code.

4

Le premier argument à write() est le file descriptor à écrire dans.

Lors du premier appel, le code écrit à l'une des extrémités du canal (pipefd[1]). Dans le second appel, il écrit dans le descripteur de fichier 1, qui dans les systèmes compatibles POSIX est toujours la sortie standard (la console). Le descripteur de fichier 2 est une erreur standard, pour ce que ça vaut.

5

Le programme crée un canal via l'appel pipe(2). Le tuyau a un descripteur de fichier ouvert pour la lecture (pipefd[0]) et un ouvert pour l'écriture (pipefd[1]). Le programme écrit d'abord "Bonjour monde \ n" à l'écrire fin de la conduite, puis lit le message sur lire fin du tuyau. Le message est ensuite écrit sur la console (stdout) via le descripteur de fichier appel write(2) 1.


Beej's Guide to Unix Interprocess Communication fournit quelques bonnes informations sur Unix/Linux IPC. Vous trouverez souvent des références à son autre guide, Beej's Guide to Network Programming.

J'ai trouvé Understanding UNIX/LINUX Programming: A Guide to Theory and Practice par Bruce Molay pour être un excellent livre sur la programmation système Unix/Linux.