Programação C

Chamada de sistema de tubulação em C

Chamada de sistema de tubulação em C
tubo() é uma função do sistema Linux. O tubo() função do sistema é usada para abrir descritores de arquivo, que são usados ​​para se comunicar entre diferentes processos 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.

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:

#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:

$ man 2 pipe
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
 
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.

#incluir

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

Então, é assim que você usa a chamada de sistema pipe () na linguagem de programação C. Obrigado por ler este artigo.

Emular cliques do mouse passando o mouse usando o mouse sem cliques no Windows 10
Usar um mouse ou teclado na postura errada de uso excessivo pode resultar em muitos problemas de saúde, incluindo tensão, síndrome do túnel do carpo e...
Adicione gestos do mouse ao Windows 10 usando essas ferramentas gratuitas
Nos últimos anos, os computadores e sistemas operacionais evoluíram muito. Houve um tempo em que os usuários tinham que usar comandos para navegar pel...
Controle e gerencie o movimento do mouse entre vários monitores no Windows 10
Gerenciador de mouse com tela dupla permite que você controle e configure o movimento do mouse entre vários monitores, diminuindo seus movimentos pert...