Programa C para demonstrar fork() e pipe()
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.
As postagens do blog Acervo Lima te ajudaram? Nos ajude a manter o blog no ar!
Faça uma doação para manter o blog funcionando.
70% das doações são no valor de R$ 5,00...
Diógenes Lima da Silva