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