A sintaxe do tubo() função é:
inttubo(intpipefd[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:
#incluir
Para obter mais informações sobre a função do sistema pipe (), verifique a página de manual de pipe () com o seguinte comando:
$ man2tuboA 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
inta Principal(vazio) {
intpipefds[2];
E se(tubo(pipefds) == -1) {
perror ('tubo');
saída (EXIT_FAILURE);
}
printf ('Ler o valor do descritor do arquivo:% d n',pipefds[0]);
printf ('Gravar valor do descritor de arquivo:% d n',pipefds[1]);
RetornaEXIT_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 linha a seguir.
intpipefds[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 em caso de falha da função de tubo.
E se(tubo(pipefds) == -1) {perror ('tubo');
saída (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 o 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
inta Principal(vazio) {
intpipefds[2];
Caracteresamortecedor[5];
E se(tubo(pipefds) == -1) {
perror ('tubo');
saída (EXIT_FAILURE);
}
Caracteres *alfinete= '4128 0';
printf ('Escrevendo PIN para pipe ... n');
escrever(pipefds[1],alfinete, 5);
printf ('Feito. n n');
printf ('Lendo PIN do tubo ... n');
leitura(pipefds[0],amortecedor, 5);
printf ('Feito. n n');
printf ('PIN do tubo:% s n',amortecedor);
RetornaEXIT_SUCCESS;
}
Este programa basicamente mostra como gravar no cano e ler os dados que você gravou no cano.
Aqui, armazenei um código PIN de 4 caracteres em um Caracteres variedade. O comprimento da matriz é 5 (incluindo o caractere NULL 0).
Caracteres *alfinete= '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 escrever() função usando o descritor de arquivo do canal de gravação pipefds [1] do seguinte modo.
escrever(pipefds[1],alfinete, 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.
Caracteresamortecedor[5];Agora, posso ler o PIN do tubo e armazená-lo no amortecedor array com a seguinte linha.
leitura(pipefds[0],amortecedor, 5);Agora que li o PIN do pipe, posso imprimi-lo usando o printf () funcionar como de costume.
printf ('PIN do tubo:% s n',amortecedor);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
inta Principal(vazio) {
intpipefds[2];
Caracteres *alfinete;
Caracteresamortecedor[5];
E se(tubo(pipefds) == -1) {
perror ('tubo');
saída (EXIT_FAILURE);
}
pid_t pid=garfo();
E se(pid== 0) { // no processo filho
alfinete= '4821 0'; // PIN para enviar
fechar(pipefds[0]); // feche ler fd
escrever(pipefds[1],alfinete, 5); // escreva o PIN no tubo
printf ('Gerando PIN no filho e enviando ao pai ... n');
dormir(2); // atraso intencional
saída (EXIT_SUCCESS);
}
E se(pid> 0) { // no processo principal
esperar(NULO); // espera que o processo filho termine
fechar(pipefds[1]); // fechar escrever fd
leitura(pipefds[0],amortecedor, 5); // ler o PIN do tubo
fechar(pipefds[0]); // feche ler fd
printf ('Pai recebeu PIN'% s ' n',amortecedor);
}
RetornaEXIT_SUCCESS;
}
Neste exemplo, mostrei como usar o pipe para comunicação entre processos. Eu 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=garfo();Então, no processo filho ( pid == 0 ), Escrevi o PIN no tubo usando o escrever() função.
escrever(pipefds[1],alfinete, 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.
leitura(pipefds[0],amortecedor, 5);Em seguida, o processo pai imprimiu o PIN usando printf () funcionar como de costume.
printf ('Pai recebeu PIN'% s ' n',amortecedor);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
vaziogetPIN(Caracteresalfinete[PIN_LENGTH+ 1]) {
srand (getpid() +getppid());
alfinete[0] = 49 + fileira () % 7;
para(inteu= 1;eu<PIN_LENGTH;eu++) {
alfinete[eu] = 48 + fileira () % 7;
}
alfinete[PIN_LENGTH] = ' 0';
}
inta Principal(vazio) {
enquanto(1) {
intpipefds[2];
Caracteresalfinete[PIN_LENGTH+ 1];
Caracteresamortecedor[PIN_LENGTH+ 1];
tubo(pipefds);
pid_t pid=garfo();
E se(pid== 0) {
getPIN(alfinete); // gerar PIN
fechar(pipefds[0]); // feche ler fd
escrever(pipefds[1],alfinete,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.
saída (EXIT_SUCCESS);
}
E se(pid> 0) {
esperar(NULO); // esperando a criança terminar
fechar(pipefds[1]); // fechar escrever fd
leitura(pipefds[0],amortecedor,PIN_LENGTH+ 1); // ler o PIN do tubo
fechar(pipefds[0]); // feche ler fd
printf ('Pai recebeu PIN'% s 'da criança. n n',amortecedor);
}
}
RetornaEXIT_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 pipe 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 + C .
Portanto, é assim que você usa a chamada de sistema pipe () na linguagem de programação C. Obrigado por ler este artigo.