Tudo sobre a função pipe ():
A sintaxe do tubo() função é:
int pipe (int pipefd [2]);Aqui, a função pipe () cria um canal de dados unidirecional para comunicação entre processos. Você passa em um int Array de tipo (inteiro) pipefd consistindo em 2 elementos de matriz para o tubo de função (). Em seguida, a função pipe () cria dois descritores de arquivo no pipefd variedade.
O primeiro elemento do pipefd variedade, pipefd [0] é usado para ler dados do tubo.
O segundo elemento do pipefd variedade, pipefd [1] é usado para gravar dados no tubo.
Em caso de sucesso, a função pipe () retorna 0. Se ocorrer um erro durante a inicialização do pipe, a função pipe () retorna -1.
A função pipe () é definida no cabeçalho unistd.h. Para usar a função pipe () em seu programa C, você deve incluir o cabeçalho unistd.h do seguinte modo:
#incluirPara obter mais informações sobre a função do sistema pipe (), verifique a página de manual de pipe () com o seguinte comando:
$ man 2 pipeA página de manual do pipe ().
Exemplo 1:
Para o primeiro exemplo, crie um novo arquivo de origem C 1_pipe.c e digite as seguintes linhas de códigos.
#incluir#incluir
#incluir
int main (void)
int pipefds [2];
if (pipe (pipefds) == -1)
perror ("tubo");
sair (EXIT_FAILURE);
printf ("Ler valor do descritor do arquivo:% d \ n", pipefds [0]);
printf ("Gravar Valor do Descritor de Arquivo:% d \ n", pipefds [1]);
return EXIT_SUCCESS;
Aqui, incluí o arquivo de cabeçalho de pipe () unistd.h primeiro com a seguinte linha.
#incluirEntão, no a Principal() função, eu defini o pipefds array inteiro de dois elementos com a seguinte linha.
int pipefds [2];Em seguida, executei a função pipe () para inicializar a matriz de descritores de arquivo pipefds do seguinte modo.
tubo (pipefds)Também verifiquei a existência de erros usando o valor de retorno da função pipe (). Eu usei o saída() função para terminar o programa no caso de a função do tubo falhar.
if (pipe (pipefds) == -1)perror ("tubo");
sair (EXIT_FAILURE);
Em seguida, imprimi o valor dos descritores de arquivo de canal de leitura e gravação pipefds [0] e pipefds [1] respectivamente.
printf ("Ler valor do descritor do arquivo:% d \ n", pipefds [0]);printf ("Gravar Valor do Descritor de Arquivo:% d \ n", pipefds [1]);
Se você executar o programa, deverá ver a seguinte saída. Como você pode ver, o valor do descritor de arquivo do canal de leitura pipefds [0] é 3 e escrever descritor de arquivo de canal pipefds [1] é 4.
Exemplo 2:
Crie outro arquivo de origem C 2_pipe.c e digite as seguintes linhas de códigos.
#incluir#incluir
#incluir
#incluir
int main (void)
int pipefds [2];
buffer char [5];
if (pipe (pipefds) == -1)
perror ("tubo");
sair (EXIT_FAILURE);
char * pin = "4128 \ 0";
printf ("Escrevendo PIN no pipe… \ n");
escrever (pipefds [1], pino, 5);
printf ("Feito.\ n \ n ");
printf ("Lendo PIN do pipe… \ n");
ler (pipefds [0], buffer, 5);
printf ("Feito.\ n \ n ");
printf ("PIN do tubo:% s \ n", buffer);
return EXIT_SUCCESS;
Este programa basicamente mostra como escrever no tubo e ler os dados que você escreveu no tubo.
Aqui, armazenei um código PIN de 4 caracteres em um Caracteres variedade. O comprimento da matriz é 5 (incluindo o caractere NULL \ 0).
char * pin = "4128 \ 0";Cada caractere ASCII tem 1 byte de tamanho em C. Portanto, para enviar o PIN de 4 dígitos pelo pipe, você deve escrever 5 bytes (4 + 1 caractere NULL) de dados no pipe.
Para gravar 5 bytes de dados (alfinete) no tubo, usei o Escreva() função usando o descritor de arquivo do canal de gravação pipefds [1] do seguinte modo.
escrever (pipefds [1], pino, 5);Agora que tenho alguns dados no tubo, posso lê-los do tubo usando o leitura() função no descritor de arquivo do canal de leitura pipefds [0]. Como escrevi 5 bytes de dados (alfinete) no tubo, estarei lendo 5 bytes de dados do tubo também. Os dados lidos serão armazenados no amortecedor matriz de caracteres. Como estarei lendo 5 bytes de dados do tubo, o amortecedor a matriz de caracteres deve ter pelo menos 5 bytes.
Eu defini o amortecedor matriz de caracteres no início do a Principal() função.
buffer char [5];Agora, posso ler o PIN do tubo e armazená-lo no amortecedor array com a seguinte linha.
ler (pipefds [0], buffer, 5);Agora que li o PIN do pipe, posso imprimi-lo usando o printf () funcionar normalmente.
printf ("PIN do tubo:% s \ n", buffer);Depois de executar o programa, a saída correta é exibida como você pode ver.
Exemplo 3:
Crie um novo arquivo de origem C 3_pipe.c como digite nas seguintes linhas de códigos.
#incluir#incluir
#incluir
#incluir
#incluir
int main (void)
int pipefds [2];
char * pin;
buffer char [5];
if (pipe (pipefds) == -1)
perror ("tubo");
sair (EXIT_FAILURE);
pid_t pid = fork ();
if (pid == 0) // no processo filho
pin = "4821 \ 0"; // PIN para enviar
fechar (pipefds [0]); // feche ler fd
escrever (pipefds [1], pino, 5); // escreva o PIN no tubo
printf ("Gerando PIN no filho e enviando ao pai ... \ n");
dormir (2); // atraso intencional
sair (EXIT_SUCCESS);
if (pid> 0) // no processo principal
esperar (NULL); // espera que o processo filho termine
fechar (pipefds [1]); // fechar escrever fd
ler (pipefds [0], buffer, 5); // ler o PIN do tubo
fechar (pipefds [0]); // feche ler fd
printf ("Pai recebeu PIN '% s' \ n", buffer);
return EXIT_SUCCESS;
Neste exemplo, mostrei como usar o pipe para comunicação entre processos. Enviei um PIN do processo filho para o processo pai usando um pipe. Em seguida, leia o PIN do canal no processo pai e imprima-o a partir do processo pai.
Primeiro, criei um processo filho usando a função fork ().
pid_t pid = fork ();Então, no processo filho (pid == 0), Escrevi o PIN no tubo usando o Escreva() função.
escrever (pipefds [1], pino, 5);Uma vez que o PIN é gravado no canal a partir do processo filho, o processo pai (pid> 0) lê-lo do tubo usando o leitura() função.
ler (pipefds [0], buffer, 5);Em seguida, o processo pai imprimiu o PIN usando printf () funcionar normalmente.
printf ("Pai recebeu PIN '% s' \ n", buffer);Como você pode ver, a execução do programa dá o resultado esperado.
Exemplo 4:
Crie um novo arquivo de origem C 4_pipe.c como digite nas seguintes linhas de códigos.
#incluir#incluir
#incluir
#incluir
#incluir
#define PIN_LENGTH 4
#define PIN_WAIT_INTERVAL 2
void getPIN (char pin [PIN_LENGTH + 1])
srand (getpid () + getppid ());
pino [0] = 49 + rand ()% 7;
para (int i = 1; i < PIN_LENGTH; i++)
pino [i] = 48 + rand ()% 7;
pin [PIN_LENGTH] = '\ 0';
int main (void)
enquanto (1)
int pipefds [2];
pin char [PIN_LENGTH + 1];
buffer de char [PIN_LENGTH + 1];
tubo (pipefds);
pid_t pid = fork ();
if (pid == 0)
getPIN (pin); // gerar PIN
fechar (pipefds [0]); // feche ler fd
escrever (pipefds [1], pin, PIN_LENGTH + 1); // escreva o PIN no tubo
printf ("Gerando PIN no filho e enviando ao pai ... \ n");
dormir (PIN_WAIT_INTERVAL); // atrasando a geração do PIN intencionalmente.
sair (EXIT_SUCCESS);
if (pid> 0)
esperar (NULL); // esperando a criança terminar
fechar (pipefds [1]); // fechar escrever fd
ler (pipefds [0], buffer, PIN_LENGTH + 1); // ler o PIN do tubo
fechar (pipefds [0]); // feche ler fd
printf ("O pai recebeu o PIN '% s' da criança.\ n \ n ", buffer);
return EXIT_SUCCESS;
Este exemplo é o mesmo que Exemplo 3. A única diferença é que este programa cria continuamente um processo filho, gera um PIN no processo filho e envia o PIN ao processo pai usando um pipe.
O processo pai então lê o PIN do tubo e o imprime.
Este programa gera um novo PIN_LENGTH PIN a cada PIN_WAIT_INTERVAL segundos.
Como você pode ver, o programa funciona conforme o esperado.
Você só pode parar o programa pressionando
Então, é assim que você usa a chamada de sistema pipe () na linguagem de programação C. Obrigado por ler este artigo.