next up previous
Next: Pipe-uri cu nume Up: Conceptul de pipe (canal Previous: Conceptul de pipe (canal

Pipe-uri fara nume

Pipe-urile fara nume nu au o intrare in structura de directoare. Ele pot fi create folosind apelul pipe. Sintaxa de apel este:

#include <unistd.h>

int pipe (int fd[2]);

Dupa cum se observa, functia primeste ca parametru un vector de doi descriptori de fisier. Unul din acestia va fi folosit pentru scriere, iar celalalt pentru citire. In momentul in care un proces scrie in fd[1] (capatul de scriere), un alt proces poate citi acea informatie in fd[0] (capatul de citire).

Mai jos sunt prezentate doua exemple de utilizare a pipe-urilor. Al doilea arata si utilitatea acestora: transferul rapid al informatiilor intre doua procese (aflate in relatie tata-fiu).

/*
 * implementare simpla a unui pipe fara nume
 */

#define _POSIX_SOURCE      1

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

int main (void)
{
        int n_bytes;
        int pipefd[2];
        const char some_data[] = "123";
        char buffer[BUFSIZ + 1];

        memset (buffer, '\0', sizeof (buffer));

        if (pipe (pipefd) < 0) {
                perror ("pipe");
                exit (EXIT_FAILURE);
        }

        n_bytes = write (pipefd[1], some_data, strlen (some_data));
        if (n_bytes < 0) {
                perror ("write");
                exit (EXIT_FAILURE);
        }

        printf ("Wrote %d bytes\n", n_bytes);

        n_bytes = read (pipefd[0], buffer, BUFSIZ);
        if (n_bytes < 0) {
                perror ("read");
                exit (EXIT_FAILURE);
        }

        printf ("Read %d bytes: %s\n", n_bytes, buffer);

        return 0;
}



/*
 * pipe_fork.c - comunicatie intre un proces tata si un proces fiu
 */

#define _POSIX_SOURCE     1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

int main (void)
{
        int n_bytes;
        int pipefd[2];
        const char some_data[] = "123";
        char buffer[BUFSIZ + 1];
        pid_t pid;

        memset (buffer, '\0', sizeof(buffer));

        if (pipe (pipefd) < 0) {
                perror ("pipe");
                exit (EXIT_FAILURE);
        }

        pid = fork ();

        switch (pid) {
        case -1:
                perror ("fork");
                exit (EXIT_FAILURE);

                break;

        case 0:    /* procesul fiu citeste informatia din pipe */
                n_bytes = read (pipefd[0], buffer, BUFSIZ);
                if (n_bytes < 0) {
                        perror ("read");
                        exit (EXIT_FAILURE);
                }

                printf ("Read %d bytes: %s\n", n_bytes, buffer);
                exit(EXIT_SUCCESS);

                break;

        default:   /* procesul parinte scrie informatia in pipe */
                n_bytes = write (pipefd[1], some_data, strlen(some_data));
                if (n_bytes < 0) {
                        perror ("write");
                        exit (EXIT_FAILURE);
                }

                printf ("Wrote %d bytes: %s\n", n_bytes, some_data);
                exit(EXIT_SUCCESS);
        }

        return 0;
}

Cel de-al doilea program genereaza urmatorul output:

razvan@ragnarok:~/cfiles/solab/labs/lab3$ gcc -Wall -ansi -pedantic pipe_fork.c
razvan@ragnarok:~/cfiles/solab/labs/lab3$ ./a.out Wrote 3 bytes: 123
razvan@ragnarok:~/cfiles/solab/labs/lab3$ Read 3 bytes: 123



Razvan Adrian Deaconescu 2005-10-19