Escreva o programa Linux C para criar dois processos P1 e P2. P1 pega uma string e a passa para P2. P2 concatena a string recebida com outra string sem usar a função string e a envia de volta a P1 para impressão.

Exemplos:

Other string is: forgeeks.org

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

Explicação:

  • Para criar o processo filho, usamos fork(). fork() retorna:

    • <0 falha ao criar processo filho (novo)
    • = 0 para processo filho
    • > 0, isto é, ID de processo do processo filho para o processo pai. Quando> 0, o processo pai será executado.
  • pipe() é usado para passar informações de um processo para outro. pipe() é unidirecional, portanto, para comunicação bidirecional entre processos, dois tubos podem ser configurados, um para cada direção.
     Exemplo: 
     int fd [2];
     tubo (fd);
     fd [0]; // -> para usar read end 
     fd [1]; // -> para usar fim de gravação
     

Por Dentro do Processo Pai: Primeiramente fechamos a extremidade de leitura do primeiro tubo (fd1 [0]) e, em seguida, escrevemos a string através da extremidade de escrita do tubo (fd1 [1]). Agora o pai vai esperar até que o processo filho seja concluído. Após o processo filho, o pai fechará a extremidade de gravação do segundo tubo (fd2 [1]) e lerá a string por meio da leitura do final do tubo (fd2 [0]).

Dentro do processo filho: o filho lê a primeira string enviada pelo processo pai fechando a extremidade de gravação do canal (fd1 [1]) e, após a leitura, concatena a string e passa a string para o processo pai via tubo fd2 e sairá.

// C program to demonstrate use of fork() and pipe()
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<string.h>
#include<sys/wait.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);
    }
}
Input : www.geeks
Output : Concatenated string
         www.geeksforgeeks.org


Referências:

http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/create.html
http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process /fork/wait.html
http://searchenterpriselinux.techtarget.com/definition/pipe

Este artigo é uma contribuição de Kartik Ahuja . Se você gosta de GeeksforGeeks e gostaria de contribuir, você também pode escrever um artigo usando contribute.geeksforgeeks.org ou enviar o seu artigo para contribute@geeksforgeeks.org. Veja o seu artigo na página principal do GeeksforGeeks e ajude outros Geeks.

Escreva comentários se encontrar algo incorreto ou se quiser compartilhar mais informações sobre o tópico discutido acima.

Quer aprender com os melhores vídeos com curadoria e problemas práticos, confira o C Foundation Course for Basic to Advanced C.