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