Chamada do sistema Linux Popen em C

Chamada Do Sistema Linux Popen Em C



A função popen() executará o comando dado pelo comando da string. A função deve retornar um ponteiro para um fluxo que é usado para ler ou gravar no pipe enquanto também cria um pipe entre o aplicativo de chamada e o comando executado. A função Popen está disponível na biblioteca padrão da função de E/S e gera um segundo processo para executar um comando de terminal. A fase aberta do popen() é a mesma que a fase aberta da função fopen(). A função popen() inicia um processo bifurcando, construindo um pipe e executando o shell. Como um pipe é unidirecional por padrão; como resultado, o fluxo é somente leitura ou somente gravação. Na execução bem-sucedida da função popen(), é obtido um fluxo aberto que é usado para que o pipe leia e escreva.”

Exemplo 1

Com o programa de exemplo a seguir, leremos os arquivos que existem no diretório ou pasta atual usando a chamada de sistema popen. Primeiramente, inserimos o arquivo de cabeçalho stdio.h da biblioteca padrão C. Então, temos uma função int main() do programa onde implantamos a função popen. Antes disso, estabelecemos a variável ponteiro “FileOpen” da classe “FILE”. A variável ponteiro do arquivo indica o byte seguinte para ler ou escrever.







Depois disso, atribuímos o valor limite do caractere a ser lido. A variável “FileOpen” então invocou a função “popen”. A função “popen” recebe o comando “ls -l” do Linux, que listará todos os arquivos do diretório atual. Além disso, inserimos o parâmetro “r” na função popen, que indica o modo de leitura.



Aqui, canalizamos o processo de leitura de arquivos utilizando a função popen. Em seguida, processamos o pipe criado com o loop while. O loop while usa os métodos fgets, que recebem os argumentos “line”, “sizeof the line” e “FileOpen”. Os fgets lêem o processo canalizado e o armazenam no símbolo “%s” da string. Este símbolo em particular é chamado dentro do método printf junto com o argumento “line”. Uma vez que criamos o pipe processado, com a função pclosed, o processo canalizado pode ser fechado conforme implantado no final do programa abaixo.



#include


int principal ( )

{

ARQUIVO * ArquivoAbrir;

linha de caracteres [ 130 ] ;


FileOpen = popen ( 'ls -l' , 'r' ) ;

enquanto ( fgets ( linha, tamanho da linha, FileOpen ) )

{

printf ( '%s' , linha ) ;

}

perto ( ArquivoAbrir ) ;

}





A função popen do programa C bifurcou o processo acima e, em seguida, criou o pipe. Agora, executamos o pipe processado do stream no shell com o comando de compilação C. A saída listou todos os arquivos no diretório “Home” conforme executamos o programa nesse diretório.



Exemplo 2

No programa popen anterior, temos uma demonstração simples da funcionalidade do programa popen que é usado para canalizar o processo de streaming de leitura de arquivos. Agora, pegamos outro exemplo da função popen onde canalizamos o processo com o modo de gravação. Vamos considerar o programa com a função main. Construímos a variável de ponteiro de arquivo dentro da função principal como “arquivo”. O ponteiro de arquivo é implantado com a função popen.

A função popen recebe o comando “cat” e o “w” para o modo de escrita. Aqui, cada argumento File é lido sequencialmente e enviado para a saída padrão pelo comando cat. No corpo do loop for, utilizamos a função fprintf para imprimir os valores numéricos de contagem conforme especificamos o símbolo “%d”. Em seguida, fechado, o processo popen pipe com a chamada de sistema pclose.

#include


int principal ( int argc, char ** argv ) {

ARQUIVO * Arquivo = papa ( 'gato' , 'dentro' ) ;

int x = 0 ;


por ( x = 0 ;x < 5 ;x++ ) {


fprintf ( Arquivo , 'Minha contagem = %d \n ' , x ) ;
}

perto ( Arquivo ) ;

Retorna 0 ;

}

Quando executamos o processo criado acima, ele imprimiu os valores de contagem da seguinte maneira.

Exemplo 3

Agora, temos outro programa que transfere os dados de um processo para outro processo. Faremos isso com o pipe da função popen. Implementamos o programa usando as bibliotecas padrão de C. Então, temos uma função int main para implantar um programa. Aqui, especificamos a string na função sprintf com o argumento “buffer”. A função sprintf() mantém o resultado no buffer char fornecido pelo sprintf em vez de enviá-lo para o prompt.

Depois disso, chamamos a função popen dentro da variável “read”. Lá, temos dois processos dentro da função popen. O “wc -c” é o primeiro processo que é usado para contar os caracteres fornecidos, e o segundo processo é o “w”, que indica que o pipe está aberto no modo de escrita. Depois disso, temos a função “fwrite” que usa o pipe para escrever dados. Os dados serão recebidos pelo “wc”, então contados o caractere e exibidos no shell.

#include

#include

#include

#include

int principal ( )

{

ARQUIVO * ler ;

buffer de caracteres [ cinquenta ] ;

sprintf ( amortecedor, 'Chamada de sistema Linux' ) ;

ler =abrir ( 'wc -c' , 'dentro' ) ;

escrever ( buffer, tamanho de ( Caracteres ) ,strlen ( amortecedor ) , ler ) ;

perto ( ler ) ;

}

Os caracteres exibidos no prompt são “17” porque a string que especificamos acima contém “17” caracteres. O processo “wc -c” lê esses caracteres e os imprime como saída.

Exemplo 4

O exemplo acima de popen envia os dados de um processo para outro. Aqui, receberemos os dados de um processo para o outro processo por meio de um pipe. A principal função do programa é construir o buffer, que recebe valores “50”. Em seguida, criamos a variável “r”, onde a função popen criava o processo. O processo “ls” é usado para listar os arquivos do diretório e o processo “r” para ler os dados do pipe. O processo “ls” transmite os dados para o processo “r” para leitura. Depois disso, temos a função fread, que lê os dados e armazena os dados no buffer. Em seguida, a instrução print imprimirá os dados armazenados no buffer.

#include

#include

#include

#include

int principal ( )

{

ARQUIVO * r;

buffer de caracteres [ cinquenta ] ;


r = papa ( 'ls' , 'r' ) ;

assustar ( amortecedor, 1 , 25 , r ) ;


printf ( '%s \n ' , amortecedor ) ;

perto ( r ) ;

}

Aqui, apenas “50” caracteres dos arquivos existentes são exibidos no diretório de trabalho. Portanto, a saída terá apenas 50 caracteres.

Conclusão

Demos uma demonstração detalhada das chamadas do sistema popen do Linux na linguagem C. Implementamos quatro exemplos em que implantamos a função popen. A função popen retorna o fluxo do tubo de acordo com o modo que atribuímos. Nos exemplos, usamos o modo de leitura e gravação com as funções de manipulação de arquivos fread e fwrite. Usamos o nome do programa na função popen() como seu primeiro argumento. O segundo argumento é um arquivo “r” como leitura ou “w” como modo de gravação.