Cópia de string usando tubos
Pergunta
Eu escrevi o código a seguir para copiar uma string "Hello World" para outra matriz de char usando garfo e tubos em vez de usar funções de biblioteca padrão ou fluxos de E/S padrão. O programa está compilando com sucesso, mas não estou obtendo nenhuma saída. Mesmo, a saída do printf não está sendo mostrada.
# include <string.h>
# include <unistd.h>
# include <stdio.h>
char string[] = "hello world";
int main()
{
int count, i;
int toPar[2], toChild[2];
char buf[256];
pipe(toPar);
pipe(toChild);
if (fork() == 0)
{
printf("\n--- child process ---");
close(0);
dup(toChild[0]);
close(1);
dup(toPar[1]);
close(toPar[1]);
close(toChild[0]);
close(toPar[0]);
close(toChild[1]);
for (;;)
{
if ((count = read(0, buf, sizeof(buf))) == 0)
break;
printf("\nChild buf: %s", buf);
write(1, buf, count);
}
}
printf("\n--- parent process ---");
close(1);
dup(toChild[1]);
close(0);
dup(toPar[0]);
close(toPar[1]);
close(toChild[0]);
close(toPar[0]);
close(toChild[1]);
for (i = 0; i < 15; i++)
{
write(1, string, strlen(string));
printf("\nParent buf: %s", buf);
read(0, buf, sizeof(buf));
}
return 0;
}
Solução
Sua printf
S está escrevendo para stdout
- Mas tanto no pai quanto no filho, você redirecionou o descritor de arquivo 1 para um tubo, então é aí que o printf
a saída será visto.
Ao invés de printf(...)
, usar fprintf(stderr, ...)
- Então você poderá ver a saída, já que stderr
ainda está apontando para o seu terminal.
Observe que você tem alguns bugs:
- A criança deve ligar
_exit(0)
Quando for feito, caso contrário, ele entrará no código pai; - a
write
Deveria usarstrlen(string) + 1
, para que ele grava o terminador NUL.
Outras dicas
Tente adicionar um " n", como printf("\nParent buf: %s\n", buf);
Eu acho que esses tubos estão bloqueando o IO, então leia simplesmente não retornará, a menos que o tubo seja fechado pelo outro processo. Isso, e o Printf fazendo IO em buffer, impede que você obtenha qualquer saída.