Chamada do sistema de tubo em C

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

All About Pipe () Função:

A sintaxe do cano() função é:

tubo int (int pipefd [2]);

Aqui, a função Pipe () cria um canal de dados unidirecional para comunicação entre processos. Você passa em um int Matriz de tipo (número inteiro) PipeFD consistindo em 2 elemento de matriz no tubo de função (). Então 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 escrever dados no tubo.

No sucesso, a função Pipe () retorna 0. Se ocorrer um erro durante a inicialização do tubo, 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 (), consulte a página Man of Pipe () com o seguinte comando:

$ man 2 tubo
A página do homem 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");
saída (exit_failure);

printf ("Leia o valor do descritor de arquivo: %d \ n", PipeFDS [0]);
printf ("Write Arquivo Descritor Valor: %d \ n", Pipefds [1]);
return exit_success;

Aqui, incluí o arquivo de cabeçalho do Pipe () unistd.h primeiro com a seguinte linha.

#incluir

Então, no 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 dos descritores de arquivo PIPEFDS do seguinte modo.

tubo (PipeFDs)

Eu também verifiquei os erros usando o valor de retorno da função Pipe (). Eu usei o saída() função para terminal o programa, caso a função do tubo falhe.

if (Pipe (PipeFds) == -1)
perror ("tubo");
saída (exit_failure);

Em seguida, imprimi o valor dos descritores de arquivo de leitura e gravação Pipefds [0] e Pipefds [1] respectivamente.

printf ("Leia o valor do descritor de arquivo: %d \ n", PipeFDS [0]);
printf ("Write Arquivo Descritor Valor: %d \ n", Pipefds [1]);

Se você executar o programa, verá a seguinte saída. Como você pode ver, o valor do descritor de arquivo de tubo de leitura Pipefds [0] é 3 e escreva o descritor de arquivo de tubulação 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 de char [5];
if (Pipe (PipeFds) == -1)
perror ("tubo");
saída (exit_failure);

char *pin = "4128 \ 0";
printf ("Escrevendo o pino para tubo… \ n");
Write (PipeFDs [1], Pin, 5);
printf ("feito.\ n \ n ");
printf ("Reading Pin From Pipe… \ n");
Leia (PipeFDS [0], Buffer, 5);
printf ("feito.\ n \ n ");
printf ("Pin do tubo: %s \ n", buffer);
return exit_success;

Este programa mostra basicamente como escrever no tubo e ler os dados que você escreveu no tubo.

Aqui, eu armazenei um código de pino de 4 caracteres em um Caracteres variedade. O comprimento da matriz é 5 (incluindo o caractere nulo \ 0).

char *pin = "4128 \ 0";

Cada caractere ASCII tem 1 byte de tamanho em C. Então, para enviar o pino de 4 dígitos através do tubo, você deve escrever 5 bytes (4 + 1 caractere nulo) de dados no tubo.

Para escrever 5 bytes de dados (alfinete) no cano, eu usei o escrever() função usando o descritor de arquivo de tubulação de gravação Pipefds [1] do seguinte modo.

Write (PipeFDs [1], Pin, 5);

Agora que tenho alguns dados no tubo, posso lê -los no tubo usando o ler() função no descritor de arquivo de tubo 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 Array do personagem. Como eu estarei lendo 5 bytes de dados do tubo, o amortecedor A matriz de personagens deve ter pelo menos 5 bytes.

Eu defini o amortecedor matriz de personagens no início do principal() função.

buffer de char [5];

Agora, posso ler o alfinete do tubo e armazená -lo no amortecedor Array com a seguinte linha.

Leia (PipeFDS [0], Buffer, 5);

Agora que li o alfinete do tubo, posso imprimi -lo usando o printf () função como de costume.

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 tipo nas seguintes linhas de códigos.

#incluir
#incluir
#incluir
#incluir
#incluir
int main (void)
int pipefds [2];
char *pino;
buffer de char [5];
if (Pipe (PipeFds) == -1)
perror ("tubo");
saída (exit_failure);

pid_t pid = fork ();
if (pid == 0) // no processo infantil
pin = "4821 \ 0"; // PIN para enviar
fechar (Pipefds [0]); // Fechar leia FD
Write (PipeFDs [1], Pin, 5); // escreva pino para tubos
printf ("Gerando pino na criança e envio para o pai… \ n");
sono (2); // Atraso intencional
saída (exit_success);

if (pid> 0) // no processo principal
espere (nulo); // Aguarde o processo infantil terminar
fechar (Pipefds [1]); // Fechar escreva FD
Leia (PipeFDS [0], Buffer, 5); // Leia o pino do tubo
fechar (Pipefds [0]); // Fechar leia FD
printf ("Pai recebeu o pino '%s' \ n", buffer);

return exit_success;

Neste exemplo, mostrei como usar o Pipe para comunicação entre processos. Enviei um alfinete do processo filho para o processo pai usando um tubo. Em seguida, leia o pino do tubo no processo pai e imprimiu -o do processo pai.

Primeiro, criei um processo infantil usando a função Fork ().

pid_t pid = fork ();

Então, no processo infantil (pid == 0), Escrevi o alfinete no tubo usando o escrever() função.

Write (PipeFDs [1], Pin, 5);

Depois que o pino é escrito no tubo do processo infantil, o processo pai (PID> 0) leia -o no tubo usando o ler() função.

Leia (PipeFDS [0], Buffer, 5);

Então, o processo pai imprimiu o pino usando printf () função como de costume.

printf ("Pai recebeu o pino '%s' \ n", buffer);

Como você pode ver, a execução do programa fornece o resultado esperado.

Exemplo 4:

Crie um novo arquivo de origem C 4_pipe.c como tipo 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];
pino de char [pin_length + 1];
buffer de char [pin_length + 1];
tubo (pipefds);
pid_t pid = fork ();
if (pid == 0)
getpin (pino); // gerar pino
fechar (Pipefds [0]); // Fechar leia FD
Write (PipeFDS [1], pin, pin_length + 1); // escreva pino para tubos
printf ("Gerando pino na criança e envio para o pai… \ n");
sono (pin_wait_interval); // atrasando a geração de pinos intencionalmente.
saída (exit_success);

if (pid> 0)
espere (nulo); // esperando a criança terminar
fechar (Pipefds [1]); // Fechar escreva FD
Leia (PipeFDS [0], Buffer, Pin_Length + 1); // Leia o pino do tubo
fechar (Pipefds [0]); // Fechar leia FD
printf ("Pai recebeu o pino '%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 infantil, gera um alfinete no processo filho e envia o pino para o processo pai usando um tubo.

O processo pai lê o alfinete do tubo e o imprime.

Este programa gera um novo pino pin_length todos os segundos pin_wait_interval.

Como você pode ver, o programa funciona conforme o esperado.

Você só pode parar o programa pressionando + C.

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