miércoles, 10 de marzo de 2010

PIPE

Una tubería (pipe) proporciona una interfase entre dos procesos. Es un par de
descriptores de archivos especial que en lugar de estar conectado con un archivo, está
conectado a otro proceso. Así, cuando un proceso A escribe a su tubería, el proceso B
puede leer esos datos desde su descriptor de archivo de tubería. Existe la posibilidad
también de que cuando el proceso B escriba a su tubería, el proceso A pueda leer los
datos también desde su tubería. Una tubería proporciona un medio de comunicación
unidireccional para dos procesos.

Una vez que se crea una tubería, hay muy pocas diferencias entre un descriptor de archivo
de una tubería y un descriptor de archivo regular. De hecho, a menos que un programa
haga algo especial para saberlo, no sabrá que está escribiendo o leyendo una tubería en
lugar de un archivo.

NOMBRE
pipe - crea una tubería o interconexión

SINOPSIS
#include
int pipe(int descf[2]);

DESCRIPCIÓN
pipe crea un par de descriptores de archivos, que apuntan a un nodo de una tubería, y
los pone en el vector de dos elementos apuntado por descf. descf[0] es para lectura,
descf[1] es para escritura.

VALOR DEVUELTO
En caso de éxito, se devuelve cero. En caso de error se devuelve -1 y se pone un valor
apropiado en errno.

ERRORES
EMFILE El proceso tiene en uso demasiados descriptores de ficheros.
ENFILE La tabla de ficheros del sistema está llena.
EFAULT descf no es válido.

EJEMPLO
#include
#include
#include

int main(void)
{
int fd[2], nbytes;
pid_t childpid;
char string[] = "Hello, world!\n";
char readbuffer[80];

pipe(fd);

if((childpid = fork()) == -1)
{
perror("fork");
exit(1);
}

if(childpid == 0)
{
/* Child process closes up input side of pipe */
close(fd[0]);

/* Send "string" through the output side of pipe */
write(fd[1], string, (strlen(string)+1));
exit(0);
}
else
{
/* Parent process closes up output side of pipe */
close(fd[1]);

/* Read in a string from the pipe */
nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
printf("Received string: %s", readbuffer);
}

return(0);
}

No hay comentarios:

Publicar un comentario