Programa en C para demostrar fork() y pipe()

fork() se usa para crear un proceso hijo. Este proceso hijo es una copia del proceso original (padre). Es el método principal de creación de procesos en sistemas operativos similares a Unix. (Consulte este artículo como referencia).

Sintaxis:

fork(); 
// It does not take any parameter, it returns 
// integer values. It may return negative, 
// positive or zero integer values.

pipe(): Se utiliza para la comunicación entre procesos en Linux. Es una función del sistema. (Ver este artículo como referencia)

Sintaxis:

int pipe(int pipefd[2]);

Programa en C para demostrar fork() y pipe():

Escriba el programa Linux C para crear dos procesos P1 y P2. P1 toma una cuerda y se la pasa a P2. P2 concatena la string recibida con otra string sin utilizar la función de string y la envía de vuelta a P1 para su impresión.

Ejemplos: 

Other string is: forgeeks.org

Input  : www.geeks
Output : www.geeksforgeeks.org
        
Input :  www.practice.geeks
Output : practice.geeksforgeeks.org

Explicación:  

  • Para crear un proceso hijo usamos fork(). tenedor() devuelve: 
    • <0 no se pudo crear el proceso secundario (nuevo)
    • =0 para proceso hijo
    • >0 , es decir, ID de proceso del proceso secundario al proceso principal. Cuando >0 se ejecutará el proceso principal.
  • pipe() se usa para pasar información de un proceso a otro. pipe() es unidireccional, por lo tanto, para la comunicación bidireccional entre procesos, se pueden configurar dos conductos, uno para cada dirección.

Ejemplo: 

int fd[2];
pipe(fd);
fd[0]; //-> for using read end
fd[1]; //-> for using write end

Proceso principal interno: primero cerramos el extremo de lectura de la primera tubería (fd1 [0]) y luego escribimos la string a través del extremo de escritura de la tubería (fd1 [1]). Ahora el padre esperará hasta que finalice el proceso del niño. Después del proceso secundario, el padre cerrará el extremo de escritura de la segunda canalización (fd2[1]) y leerá la string hasta el final de lectura de la canalización (fd2[0]). 

Proceso secundario interno: el niño lee la primera string enviada por el proceso principal cerrando el extremo de escritura de la canalización (fd1 [1]) y, después de leer, concatena ambas strings y pasa la string al proceso principal a través de la canalización fd2 y saldrá. 

Aporte

www.geeks

C

// C program to demonstrate use of fork() and pipe()
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
 
int main()
{
    // We use two pipes
    // First pipe to send input string from parent
    // Second pipe to send concatenated string from child
 
    int fd1[2]; // Used to store two ends of first pipe
    int fd2[2]; // Used to store two ends of second pipe
 
    char fixed_str[] = "forgeeks.org";
    char input_str[100];
    pid_t p;
 
    if (pipe(fd1) == -1) {
        fprintf(stderr, "Pipe Failed");
        return 1;
    }
    if (pipe(fd2) == -1) {
        fprintf(stderr, "Pipe Failed");
        return 1;
    }
 
    scanf("%s", input_str);
    p = fork();
 
    if (p < 0) {
        fprintf(stderr, "fork Failed");
        return 1;
    }
 
    // Parent process
    else if (p > 0) {
        char concat_str[100];
 
        close(fd1[0]); // Close reading end of first pipe
 
        // Write input string and close writing end of first
        // pipe.
        write(fd1[1], input_str, strlen(input_str) + 1);
        close(fd1[1]);
 
        // Wait for child to send a string
        wait(NULL);
 
        close(fd2[1]); // Close writing end of second pipe
 
        // Read string from child, print it and close
        // reading end.
        read(fd2[0], concat_str, 100);
        printf("Concatenated string %s\n", concat_str);
        close(fd2[0]);
    }
 
    // child process
    else {
        close(fd1[1]); // Close writing end of first pipe
 
        // Read a string using first pipe
        char concat_str[100];
        read(fd1[0], concat_str, 100);
 
        // Concatenate a fixed string with it
        int k = strlen(concat_str);
        int i;
        for (i = 0; i < strlen(fixed_str); i++)
            concat_str[k++] = fixed_str[i];
 
        concat_str[k] = '\0'; // string ends with '\0'
 
        // Close both reading ends
        close(fd1[0]);
        close(fd2[0]);
 
        // Write concatenated string and close writing end
        write(fd2[1], concat_str, strlen(concat_str) + 1);
        close(fd2[1]);
 
        exit(0);
    }
}

Producción:

Concatenated string www.geeksforgeeks.org

Este artículo es una contribución de Kartik Ahuja . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *