Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <sys/wait.h>
- #include <string.h>
- int main(void) {
- int pid, p0_p1[2], p1_p2[2], p2_p0[2];
- char ch;
- /* Creare canal anonim. */
- if (-1 == pipe(p0_p1)) {
- perror("Eroare la crearea canalului anonim");
- exit(1);
- }
- if (-1 == pipe(p1_p2)) {
- perror("Eroare la crearea canalului anonim");
- exit(1);
- }
- if (-1 == pipe(p2_p0)) {
- perror("Eroare la crearea canalului anonim");
- exit(1);
- }
- /* Creare proces fiu. */
- if (-1 == (pid = fork())) {
- perror("Eroare la crearea unui proces fiu");
- exit(2);
- }
- if (pid) { /* Secvența de cod executată doar de procesul tată. */
- //printf("Am inceput executia procesului tata!\n");
- /* Tatăl își închide capătul de citire din canal. */
- close(p0_p1[0]);
- while (1) {
- ch = fgetc(stdin);
- if (ch == EOF || ch == '\n')
- break;
- //printf("Am scris caracterul : %c \n",ch);
- write(p0_p1[1], &ch, 1);
- }
- /* Tatăl își închide capătul de scriere în canal */
- close(p0_p1[1]);
- /* Fiul 1 își închide capătul de scriere în canal */
- wait(NULL);
- close(p1_p2[1]);
- /* Fiul 1 își închide capătul de citire din canal. */
- close(p0_p1[0]);
- /* Tatăl așteaptă terminarea fiului 1. */
- if (-1 == (pid = fork())) {
- perror("Eroare la crearea unui proces fiu");
- exit(2);
- }
- if (pid) {
- /* Tatăl așteaptă terminarea fiului 2. */
- wait(NULL);
- /* Tatăl își închide capătul de scriere din canal. */
- close(p2_p0[1]);
- while (read(p2_p0[0], &ch, 1) > 0)
- printf("%c", ch);
- printf("\n");
- /* Tatăl își închide capătul de citire din canal. */
- close(p2_p0[0]);
- //printf("Am terminat executia procesului tata!\n");
- } else { /* Secvența de cod executată doar de al doilea fiu. */
- //printf("Am inceput executia procesului fiu 2!\n");
- /* Fiul își închide capătul de citire din canal. */
- close(p2_p0[0]);
- /* Fiul 2 își închide capătul de scriere în canal */
- close(p1_p2[1]);
- while (read(p1_p2[0], &ch, 1) > 0) {
- if (ch >= 'a' && ch <= 'z') {
- ch -= 'a';
- ch += 'A';
- }
- //printf("Am scris caracterul : %c \n",ch);
- write(p2_p0[1], &ch, 1);
- }
- //printf("Am citit caracterele din pipe in procesul fiu 2!\n");
- /* Fiul își închide capătul de citire din canal. */
- close(p1_p2[0]);
- /* Fiull 2 își închide capătul de scriere în canalul p2_p0 */
- close(p2_p0[1]);
- //printf("Am terminat executia procesului fiu 2!\n");
- }
- } else { /* Secvența de cod executată doar de primul fiu. */
- //printf("Am inceput executia primului proces fiu!\n");
- /* Fiul 1 își închide capătul de citire din canal. */
- close(p1_p2[0]);
- /* Fiul 1 își închide capătul de scriere în canal */
- close(p0_p1[1]);
- while (read(p0_p1[0], &ch, 1) > 0)
- if (strchr("aeiouAEIOU", ch) == NULL) {
- //printf("Am scris caracterul : %c \n",ch);
- write(p1_p2[1], &ch, 1);
- }
- //printf("Am terminat executia primului proces fiu!\n");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement