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;

   }
Foi útil?

Solução

Sua printfS 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 usar strlen(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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top