Chamada de sistema de tubulação em C

Pipe System Call C



tubo() é uma função do sistema Linux. o tubo() a função do sistema é usada para abrir descritores de arquivo, que são usados ​​para se comunicar entre diferentes processos do Linux. Em suma, o tubo() função é usada para comunicação entre processos no Linux. Neste artigo, vou mostrar como usar a função de sistema pipe () no Linux. Então vamos começar.

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:

$ man2tubo
A 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.

#incluir

Entã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.