1) Pipe

 - a unidirectional data channel that can be used for interprocess communication

 - we have 2 channels: one for reading and one for writting

 - each process opens both channels

 - each process must close both channels; they can be closed at different times based on a "is-needed" scenario

 - apis: pipe, close, read, write

 

 2) Fifo

  - A FIFO special file (a named pipe) is similar to a pipe, except that it is accessed as part of the filesystem; (ls -l show pipes marked with the file type 'p')

  - it has a name making it not an an anonymous communications channel

  - having a name it can be accessed by multiple processes (need to know the name for the file)

  - can be opened for reading or for writting like a regular file

  - mkfifo, read, write, close



 3) Example


       #include <sys/types.h>

       #include <sys/wait.h>

       #include <stdio.h>

       #include <stdlib.h>

       #include <unistd.h>

       #include <string.h>



       int

       main(int argc, char *argv[])

       {

           int pipefd[2];

           pid_t cpid;

           char buf;



           if (argc != 2) {

               fprintf(stderr, "Usage: %s \n", argv[0]);

               exit(EXIT_FAILURE);

           }



           if (pipe(pipefd) == -1) {

               perror("pipe");

               exit(EXIT_FAILURE);

           }



           cpid = fork();

           if (cpid == -1) {

               perror("fork");

               exit(EXIT_FAILURE);

           }



           if (cpid == 0) {    /* Child reads from pipe */

               close(pipefd[1]);          /* Close unused write end */



               while (read(pipefd[0], &buf, 1) > 0)

                   write(STDOUT_FILENO, &buf, 1);



               write(STDOUT_FILENO, "\n", 1);

               close(pipefd[0]);

               _exit(EXIT_SUCCESS);



           } else {            /* Parent writes argv[1] to pipe */

               close(pipefd[0]);          /* Close unused read end */

               write(pipefd[1], argv[1], strlen(argv[1]));

               close(pipefd[1]);          /* Reader will see EOF */

               wait(NULL);                /* Wait for child */

               exit(EXIT_SUCCESS);

           }

       }

4) Practice Sa se scrie un program c care citeste un nume de fisier de la tastatura si un caracter (cheie de criptare) tot de la tastatura. Programul va cripta (intr-un process fiu) continutul fisierului introdus de la tastatura folosind ca si cheie de criptare caracterul introdus de utilizator. Rezultatul criptarii va fi scris intr-un fisier cu acelasi nume ca si fisierul initial la care se adauga extensia: .crypt. Criptarea se va realiza conform urmatorului algoritm: crypt = original XOR cheie. Procesul parinte va citi numele fisierului si cheia de criptare de la tastatura, va transmite prin pipe/fifo procesului fiu continutul fisierului; Fiul va citi prin pipe/fifo datele transmise de parinte, va cripta fisierul si va transmite inapoi parintelui continutul criptat Parintele va citi prin pipe/fifo datele criptate de la fiu si le va scrie in fisierul criptat.

Exemplu:

Introduceti nume fisier: test.txt

Introduceti cheie criptare: X

Rezultat scris in: test.txt.crypt