Linux llama al programa ejecutable

En el programa de la C / C ++, es necesario llamar a otros programas a primera convertido en una tarea, como otro programa en C / C ++, los comandos del sistema operativo o scripts de shell, C / C ++ proporciona la familia de funciones exec y funciones del sistema para lograr esta función .

Una, la familia de funciones exec

la familia de funciones exec proporciona una forma para iniciar otro programa para ser ejecutado en el proceso. Se puede encontrar el nombre de archivo o directorio del archivo ejecutable, y lo utilizan para reemplazar el segmento de datos del segmento proceso de llamada, el código y la pila original, después de realizar el proceso de contenido llamada original, además de la ID del proceso, el otro eran todos nuevos el proceso reemplazado. Allí, donde el archivo ejecutable puede ser un archivo binario, que puede ser cualquier archivo de comandos ejecutable de Linux.

la familia de funciones exec en la siguiente declaración:

int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],char *const envp[]);

parámetros:

ruta: la ruta del programa a ejecutar. Puede ser ruta absoluta o relativa. En execv, execl y execle tres funciones, una ruta con el nombre de archivo como un parámetro.

archivo: nombre del programa a ejecutar. Si este parámetro con el carácter "/" se considera la ejecución directa ruta; o como un nombre de archivo diferente, el sistema será especificado por el archivo especificado entorno PATH variable de búsqueda petición de capacidad.

argv: una serie de argumentos de línea de comandos.

envp: la función exec con el parámetro puede especificar una variable de matriz entorno al llamar. La otra función exec sin los parámetros de la variable de entorno es el proceso que llama.

arg: argumento número 0 es el programa que el programa propio nombre. Corresponde argv [0].

...: de línea de comandos lista de argumentos. El número de parámetros de línea de comandos cuando se llama al programa apropiado, es necesario tener el número de entradas de parámetros de entrada. Nota: Al utilizar estas funciones, todos los argumentos de línea de comandos en el último debe añadir una entrada parámetro vacío (NULL), lo que indica el final de los parámetros de línea de comandos.

Si falla la ejecución directa devuelve -1, errno almacenado en la causa de fallo.

Si tiene éxito, la función no devuelve, puede ser difícil de entender esta frase, en el execl principal del programa después de una llamada exitosa al programa llamado reemplazará el programa de llamadas, es decir, no se ejecutará el código después de la función execl .

En el desarrollo real, la más comúnmente utilizada es la función execl, el otro rara vez se utiliza, no me presenté, si pensamos execl no cumple con las necesidades del desarrollo real, ir a estudiar algunas otras funciones.

Ejemplo (book266.cpp)

/*
 * 程序名:book266.cpp,此程序用于演示用execl函数执行程序。
 * 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>

int main()
{
  int iret=execl("/bin/lss","/bin/ls","-l","/usr/include/stdio.h",0);   // /bin/lss不存在,执行不能成功。
  // int iret=execl("/bin/ls","/bin/ls","-l","/usr/include/stdio.h",0); // 可以调用成功的代码。
  printf("iret=%d\n",iret);
  if (iret==-1) printf("%d:%s\n",errno,strerror(errno));
}

En primer lugar, caso de prueba falla, el código siguiente está habilitado.

  int iret=execl("/bin/lss","/bin/ls","-l","/usr/include/stdio.h",0);   // /bin/lss不存在,执行不能成功。

Los resultados operativos

Aquí Insertar imagen Descripción

Entonces ejecución de la prueba tiene éxito, que el siguiente código.

  int iret=execl("/bin/ls","/bin/ls","-l","/usr/include/stdio.h",0); // 可以调用成功的代码。

Los resultados operativos

Aquí Insertar imagen Descripción

Los resultados de la aplicación de book266 se puede ver, el programa principal después de una llamada exitosa a execl, no se ejecutará el código después de la función execl.

Dos, la función del sistema

Otra función del sistema proporciona un método sencillo de ejecutar un programa, el comando a ser ejecutado por un parámetro pasado a la función del sistema.

Declaración de la función del sistema de la siguiente manera:

int system(const char * string);

sistema generará una llamada a la mesa un proceso hijo, el proceso hijo para llamar al bin / / sh -c cadena ejecuta la cadena de parámetros cadena de comandos representa, este comando se ejecuta inmediatamente después de que el proceso de retorno de la llamada original. SIGCHLD señal se pone en espera durante el sistema de llamada, y la señal SIGINT SIGQUIT serán ignorados.

Si el fallo tenedor para volver -1 error.

Si execl falla, cáscara no podría ser ejecutado, el valor de retorno es equivalente a la salida de la cáscara de ejecución (127).

Si se devuelve la terminación exitosa del estado de la sub-shell.

Si la llamada al sistema / bin / sh 127 no regresaron, otra razón para la falta de retorno de -1. Si la cadena de parámetro es un puntero nulo (NULL), sólo cuando el programa de procesamiento de comando está disponible, devuelve un valor distinto de cero. Si la llamada tiene éxito con el tiempo se volvió el sistema después de la aplicación del valor de retorno de los comandos de la shell, pero este valor de retorno es también probable que la llamada para el sistema de / bin / sh 127 no regresó, así que lo mejor es comprobar errno de nuevo para confirmar la correcta ejecución.

Ejemplo (book269.cpp)

/*
 * 程序名:book269.cpp,此程序用于演示用system函数执行程序。
 * 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

int main() 
{ 
  int iret;

  // 调用不成功的代码。
  iret=system("/bin/lss -l /usr/include/stdio.h"); 
  printf("iret=%d\n",iret);
  if (iret==-1) printf("%d:%s\n",errno,strerror(errno));

  // 可以调用成功的代码。
  iret=system("/bin/ls -l /usr/include/stdio.h"); 
  printf("iret=%d\n",iret);
  if (iret==-1) printf("%d:%s\n",errno,strerror(errno));
}

Los resultados operativos

Aquí Insertar imagen Descripción

En tercer lugar, el aviso de copyright

============
Network Technology C Lenguaje artículo original, que se reproduce por favor indique el enlace de la fuente con el artículo, el autor y original.
Fuente: C Tecnología de red Idioma (www.freecplus.net)
Autor: Ética código de Agricultura

Si los errores tipográficos o errores de artículos, contenido, u otras sugerencias y comentarios, por favor mensaje yo correcta, muchas gracias! ! !

Supongo que te gusta

Origin www.cnblogs.com/wucongzhou/p/12497633.html
Recomendado
Clasificación