0Pricing
C Academy · Aula

Pipes

Comunicação entre processo pai e filho.

Pipes é uma aula grátis de C Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C Academy inclui 4 aulas no total.

O que é um pipe

Um pipe é um canal de comunicação unidirecional entre processos relacionados. Um processo escreve bytes nele e outro os lê, como em uma esteira de dados.

Dois descritores de arquivos

A chamada pipe() preenche uma matriz com dois elementos: fd[0] é a extremidade de leitura e fd[1] é a extremidade de escrita. Os dados escritos em fd[1] podem ser lidos de fd[0].

#include <unistd.h>
#include <stdio.h>

int make_pipe(int fd[2]) {
    if (pipe(fd) < 0) { perror("pipe"); return -1; }
    /* fd[0] read end, fd[1] write end */
    return 0;
}

Combinando com fork

Depois de fork(), o processo pai e o filho compartilham os descritores do pipe. É assim que pai e filho se comunicam: um escreve e o outro lê.

Feche as extremidades não utilizadas

Cada processo deve fechar a extremidade que não utiliza. Um leitor fecha a extremidade de escrita; um escritor fecha a extremidade de leitura. Caso contrário, o leitor nunca verá o fim do arquivo.

#include <unistd.h>

void parent_as_writer(int fd[2]) {
    close(fd[0]);              /* parent will not read */
    write(fd[1], "hello", 5);  /* parent writes */
    close(fd[1]);              /* signal EOF to reader */
}

Um exemplo de pai e filho

O pai escreve uma mensagem; o filho a lê. Cada um fecha a extremidade de que não precisa.

#include <unistd.h>
#include <stdio.h>

void demo(int fd[2]) {
    if (fork() == 0) {           /* child: reader */
        close(fd[1]);
        char buf[64];
        ssize_t n = read(fd[0], buf, sizeof buf - 1);
        buf[n] = 0;
        printf("child got: %s\n", buf);
        close(fd[0]);
    } else {                     /* parent: writer */
        close(fd[0]);
        write(fd[1], "hi child", 8);
        close(fd[1]);
    }
}

A leitura retorna EOF

Quando todas as extremidades de escrita são fechadas, read retorna 0, sinalizando o fim do arquivo. Se uma extremidade de escrita permanecer aberta, o leitor ficará bloqueado esperando mais dados indefinidamente, um erro comum.

Capacidade e bloqueio do pipe

Um pipe tem um buffer finito (geralmente 64 KB). Quando ele fica cheio, write bloqueia até que um leitor o esvazie. Quando está vazio, read bloqueia até que os dados cheguem. Esse controle de fluxo sincroniza os dois processos.

Redirecionando com dup2

dup2 pode substituir a entrada ou a saída padrão de um processo por uma extremidade de um pipe. É assim que os shells implementam cmd1 | cmd2, conectando a saída de um comando à entrada do próximo.

#include <unistd.h>

void stdout_to_pipe(int fd[2]) {
    close(fd[0]);
    dup2(fd[1], STDOUT_FILENO); /* writes to stdout go into pipe */
    close(fd[1]);
}

Pipes nomeados (FIFOs)

Um pipe comum conecta apenas processos relacionados. Um pipe nomeado (FIFO), criado com mkfifo, aparece no sistema de arquivos, permitindo que processos não relacionados o abram pelo caminho e se comuniquem.

#include <sys/stat.h>

int make_fifo(const char *path) {
    return mkfifo(path, 0666); /* creates a FIFO file */
}

Perigo de SIGPIPE

Escrever em um pipe cuja extremidade de leitura está fechada gera SIGPIPE, que, por padrão, encerra o processo. Ignore o sinal ou verifique o erro EPIPE retornado por write.

Quando usar pipes

Pipes são ideais para fluxos simples e unidirecionais entre um processo pai e um filho ou para encadear programas. Para comunicação bidirecional ou entre processos não relacionados, considere FIFOs, sockets ou memória compartilhada.

Verificação rápida

Teste sua compreensão sobre pipes.

Recapitulação

Você aprendeu a usar pipes para a comunicação entre pai e filho.

  • pipe() fornece fd[0] (leitura) e fd[1] (escrita)
  • Combine-o com fork; feche as extremidades não utilizadas
  • read retorna 0 no EOF quando todas as extremidades de escrita são fechadas
  • FIFOs conectam processos não relacionados; tenha cuidado com SIGPIPE

Perguntas Frequentes

A aula “Pipes” é grátis?

Sim — o texto completo de “Pipes” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C Academy, atualize para CoddyKit PRO. O curso de C Academy inclui 4 aulas no total.

O que vou aprender em “Pipes”?

Comunicação entre processo pai e filho. Você pratica C Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C Academy?

Nenhuma experiência prévia é necessária. C Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.

Quanto tempo leva a aula “Pipes”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C Academy?

Sim. Cada aula de C Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Pipes
  2. Memória compartilhada
  3. Filas de mensagens
  4. Sinais
← Voltar para C Academy