Llamada al sistema Linux Popen en C

Llamada Al Sistema Linux Popen En C



La función popen() ejecutará el comando dado por el comando de la cadena. La función debe devolver un puntero a una secuencia que se utiliza para leer o escribir en la canalización y, al mismo tiempo, crear una canalización entre la aplicación que llama y el comando ejecutado. La función Popen está disponible en la biblioteca estándar de la función de E/S y genera un segundo proceso para ejecutar un comando de terminal. La fase abierta de popen() es la misma que la fase abierta de la función fopen(). La función popen() inicia un proceso bifurcando, construyendo una tubería y ejecutando el shell. Dado que una tubería es unidireccional por defecto; como resultado, la secuencia es de solo lectura o de solo escritura. En la ejecución exitosa de la función popen(), se obtiene un flujo abierto que se usa para que la tubería lea y escriba”.

Ejemplo 1

Con el siguiente programa de ejemplo, leeremos los archivos que existen en el directorio o carpeta actual utilizando la llamada al sistema popen. En primer lugar, hemos ingresado el archivo de encabezado stdio.h de la biblioteca estándar de C. Luego, tenemos una función int main() del programa donde hemos implementado la función popen. Antes de esto establecimos la variable puntero “FileOpen” de la clase “FILE”. La variable de puntero del archivo indica el byte siguiente para leer o escribir.







Después de eso, asignamos el valor límite del carácter para ser leído. La variable 'FileOpen' luego invocó la función 'abrir'. La función 'popen' toma el comando 'ls -l' de Linux, que listará todos los archivos del directorio actual. Además, hemos ingresado el parámetro 'r' en la función popen, que indica el modo de lectura.



Aquí, hemos canalizado el proceso de lectura de archivos utilizando la función popen. A continuación, procesamos la tubería creada con el ciclo while. El bucle while usa los métodos fgets, que toman los argumentos 'línea', 'tamaño de la línea' y 'Archivo abierto'. Los fgets leyeron el proceso canalizado y lo almacenaron en el símbolo '%s' de la cadena. Este símbolo en particular se llama dentro del método printf junto con el argumento 'línea'. Una vez que hemos creado la canalización procesada, con la función pclosed, el proceso canalizado se puede cerrar tal como se implementa al final del siguiente programa.



#incluir


int principal ( )

{

EXPEDIENTE * ArchivoAbrir;

línea de carbón [ 130 ] ;                                 


FileOpen = abrir ( 'los -l' , 'r' ) ;                                                                            

  tiempo ( fgets ( línea, tamaño de línea, FileOpen ) )

  {

    imprimir ( '%s' , línea ) ;

  }

cerrar ( ArchivoAbrir ) ;

}





La función popen del programa C bifurcó el proceso anterior y luego creó la tubería. Ahora, hemos ejecutado la canalización procesada de la secuencia en el shell con el comando de compilación C. La salida ha enumerado todos los archivos en el directorio 'Inicio' ya que hemos ejecutado el programa en ese directorio.



Ejemplo 2

En el programa popen anterior, tenemos una demostración simple de la funcionalidad del programa popen que se usa para canalizar el proceso de transmisión de lectura de archivos. Ahora, hemos tomado otro ejemplo de la función popen donde hemos canalizado el proceso con el modo de escritura. Consideremos el programa con la función principal. Hemos construido la variable de puntero de archivo dentro de la función principal como 'archivo'. El puntero de archivo se implementa con la función popen.

La función popen toma el comando 'gato' y la 'w' para el modo de escritura. Aquí, cada argumento de archivo se lee secuencialmente y se envía a la salida estándar mediante el comando cat. En el cuerpo del bucle for, hemos utilizado la función fprintf para imprimir los valores numéricos de conteo, ya que hemos especificado el símbolo '%d'. Luego cerró, el proceso de tubería abierta con la llamada al sistema pclose.

#incluir


int principal ( intargc, char ** argv ) {

EXPEDIENTE * expediente = abrir ( 'gato' , 'en' ) ;

entero x = 0 ;


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


fprintf ( expediente , 'Mi conteo = %d \norte ' , X ) ;
    }

cerrar ( expediente ) ;

    devolver 0 ;

}

Cuando ejecutamos el proceso creado anteriormente, imprimió los valores de conteo de la siguiente manera.

Ejemplo 3

Ahora, tenemos otro programa que transfiere los datos de un proceso a otro proceso. Haremos esto con la tubería de la función popen. Hemos implementado el programa utilizando las bibliotecas estándar de C. Luego, tenemos una función principal int para implementar un programa. Aquí, hemos especificado la cadena en la función sprintf con el argumento 'búfer'. La función sprintf() mantiene el resultado en el búfer de caracteres proporcionado por sprintf en lugar de enviarlo al aviso.

Después de eso, llamamos a la función popen dentro de la variable 'leer'. Allí, tenemos dos procesos dentro de la función popen. El 'wc -c' es el primer proceso que se utiliza para contar los caracteres proporcionados, y el segundo proceso es la 'w', que indica que la tubería está abierta en modo de escritura. Después de eso, tenemos la función 'fwrite' que usa la tubería para escribir datos. Los datos serán recibidos por el 'wc', luego contarán el carácter y se mostrarán en el caparazón.

#include

#include

#include

#include

int principal ( )

{

EXPEDIENTE * leer ;

búfer de caracteres [ 50 ] ;

correr ( buffer, 'Llamada al sistema Linux' ) ;

leer =abrir ( 'wc-c' , 'en' ) ;

escribir ( búfer, tamaño de ( carbonizarse ) estrell ( buffer ) , leer ) ;

cerrar ( leer ) ;

}

Los caracteres que se muestran en el indicador son '17' porque la cadena que hemos especificado anteriormente contiene '17' caracteres. El proceso “wc -c” lee estos caracteres y los imprime como salida.

Ejemplo 4

El ejemplo anterior de popen envía los datos de un proceso a otro. Aquí, recibiremos los datos de un proceso a otro proceso a través de una tubería. La función principal del programa es construir el búfer, que toma valores '50'. Luego, creamos la variable 'r', donde la función popen creó el proceso. El proceso 'ls' se usa para listar los archivos del directorio y el proceso 'r' para leer los datos de la tubería. El proceso 'ls' transmite los datos al proceso 'r' para leer. Después de esto, tenemos la función fread, que lee los datos y los almacena en el búfer. Luego, la declaración de impresión imprimirá los datos almacenados en el búfer.

#include

#include

#include

#include

int principal ( )

{

EXPEDIENTE * r;

búfer de caracteres [ 50 ] ;


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

miedo ( buffer, 1 , 25 r ) ;


imprimir ( '%s \norte ' , buffer ) ;

cerrar ( r ) ;

}

Aquí solo se muestran '50' caracteres de los archivos existentes desde el directorio de trabajo. Por lo tanto, la salida solo tendrá 50 caracteres.

Conclusión

Hemos dado una demostración detallada de las llamadas al sistema popen de Linux en lenguaje C. Hemos implementado cuatro ejemplos en los que hemos implementado la función popen. La función popen devuelve el flujo de tubería según el modo que le hayamos asignado. En los ejemplos, hemos utilizado tanto el modo de lectura como el de escritura con las funciones de manejo de archivos fread y fwrite. Hemos usado el nombre del programa en la función popen() como su primer argumento. El segundo argumento es un archivo 'r' como modo de lectura o 'w' como modo de escritura.