Hay varias formas y funciones para iniciar los procesos desde un programa. Cada uno de ellos ofrece diferentes soluciones al programador dependiendo de las necesidades del caso particular.
El ExecXX () La familia es un conjunto de funciones del sistema que se definen en el "unistd.H ”encabezado para ejecutar un proceso desde un programa. Esta familia de funciones nos permite enviar los argumentos de entrada al ejecutable que lo llama, por eso es un recurso muy útil para la interacción entre procesos.
En esto Pista de Linux Artículo, aprenderá todo sobre el execv () función en el lenguaje C. Veremos su sintaxis, la descripción teórica de cómo funciona, los argumentos de entrada y salida, y el tipo de datos que cada uno de ellos procesa. También aprenderá cómo crear y usar la matrices de cadenas y punteros que forman parte de los argumentos de entrada de esta familia de funciones y se pasan al proceso de llamadas.
Luego, aplicamos lo que aprendimos en un ejemplo práctico que muestra la implementación correcta y la llamada del execv () función.
Sintaxis de la función execv () en el lenguaje C
int execv (const char *ruta, char *const argv []);
Descripción de la función execv () en el idioma C
El execv () la función ejecuta un proceso desde otro proceso o programa. Esta función ejecuta el archivo o ejecutable que se especifica en el *camino argumento. Esta entrada debe contener la ruta absoluta o relativa del archivo ejecutable en formato de cadena.
El *Argv [] El argumento es una variedad de punteros a cadenas donde cada cadena es un argumento de entrada que se pasa al proceso a ejecutar. El primer puntero de la matriz siempre debe apuntar a una cadena que contiene el nombre del archivo ejecutable y el último puntero siempre debe ser nulo. Cuando execv () se llama, el proceso desde el cual se llamó se termina, reescribe y se reemplaza por el nuevo proceso en la parte asignada de la memoria y con la misma identificación.
Si la función se realiza con éxito, no regresa. Si regresa, es porque se produce un error. Los errores que puede generar esta función son variados, que van desde la ruta de archivo ejecutable no existente hasta los permisos denegados.
El error se puede identificar recuperando su valor del errar variable global. En la parte posterior, veremos una sección especial que explica los errores más comunes de esta función y su identificación.
La familia de ExecXX () Las funciones se define en el "unistd.encabezado. Para usarlos, debemos incluirlos en nuestro ".Archivo C "de la siguiente manera:
#incluir
Cómo ejecutar un proceso desde un programa utilizando la función EXECV () en el idioma C
En este ejemplo, explicaremos cómo usar el execv () función para ejecutar un proceso y pasar los argumentos de entrada de un programa a otro.
Para hacer esto, creamos dos códigos muy simples. Uno es el proceso principal que llama a la función execv () para ejecutar el proceso infantil. Cuando el execv () La función inicia el proceso infantil, lo pasa con tres argumentos de entrada en forma de una cadena que el proceso infantil recupera y muestra en el shell.
Proceso infantil
El proceso infantil es una simple pieza de código que imprime el "Yo soy el proceso infantil " mensaje, recupera los argumentos de entrada que envían el proceso principal y los muestra en el shell. Aquí está el código para el proceso infantil:
#incluir
#incluir
#incluir
int main (int argc, char *argv [])
printf ("Yo soy el proceso infantil");
printf ("argumento 1: %s \ n", argv [1]);
printf ("argumento 2: %s \ n", argv [2]);
printf ("argumento 3: %s \ n", argv [3]);
Compilamos este código y guardamos su producción en "documentos" bajo el nombre "niño" con el ".extensión de bin ”como se muestra en lo siguiente:
~ $ GCC Documents/Child.Documentos C -O/Niño.papelera
De esta manera, guardamos el archivo ejecutable de niños en "documentos". La ruta de este ejecutable es el argumento de entrada, camino, Al llamar execv () En el proceso principal.
Proceso principal
El proceso principal es el que llamamos el execv () función para ejecutar el proceso infantil. En este código, definimos una serie de punteros a las cadenas que representan los argumentos de entrada al proceso de que el execv () Se abre la función.
Puede ver cómo crear correctamente una variedad de punteros a las cuerdas en la siguiente ilustración. En este caso, consta de 5 punteros y se llama arg_ptr [].
char *arg_ptr [5];
Una vez que se define la matriz de punteros, a cada puntero se le debe asignar una cadena que contenga el argumento de entrada que enviamos al proceso infantil.
Puede ver cómo asignar cada puntero con su argumento correspondiente en formato de cadena en la siguiente ilustración:
arg_ptr [0] = "niño.C";
arg_ptr [1] = "\ nhello de";
arg_ptr [2] = "proceso 2";
arg_ptr [3] = null;
Otra forma de asignar las cuerdas a la matriz de puntero es encerrar las cuerdas en aparatos ortopédicos y separarlas con comas:
arg_ptr [] = "niño.c, "\ nhello de", "Proceso 2", nulo;
Después de definir la matriz de punteros a cada argumento, el siguiente paso es llamar al execv () función, que pasa la cadena que contiene la ruta absoluta o relativa del archivo ejecutable como el primer argumento y la matriz de cadenas arg_ptr []Como el segundo argumento.
Puede ver el "principal" completo del proceso principal en la siguiente ilustración:
#incluir
#incluir
#incluir
#incluir
#incluir
int main ()
printf ("\ n \ ni am el proceso principal \ n");
char *arg_ptr [5];
arg_ptr [0] = "niño.C";
arg_ptr [1] = "\ nhello de";
arg_ptr [2] = "proceso 2";
arg_ptr [3] = null;
execv ("/home/linuxhint/child.bin ", arg_ptr);
Compilamos este código que especifica la ruta del ".archivo c "y el nombre de la salida.
~ $ GCC Documentos/Padre.Patrón C -O
Luego, ejecutamos la salida.
~ $ ./ patrón
El proceso principal muestra el "Yo soy el proceso principal" mensaje, crea la matriz de cadenas asignando una cadena para cada argumento de entrada que se pasa al siguiente proceso, y llama al execv () función. Si el execv () la función se ejecuta con éxito, el niño.Ejecutable de bin reemplaza el proceso principal y se hace cargo de su identificación y la memoria asignada, por lo que no se puede deshacer esta acción.
El proceso del niño muestra el "Yo soy el proceso infantil" Mensaje y recupera cada uno de los argumentos de entrada que pasan el proceso principal para mostrar en la consola de comando.
Cómo reconocer posibles errores al usar la función EXECV ()
El execv () la función no regresa si se ejecuta con éxito. Si vuelve al código que lo llamó, se ha producido un error. Los errores que pueden generar esta función son múltiples ya que la operación depende de dos procesos diferentes, rutas de archivos, permisos de acceso, etc.
La forma de identificar el error es a través del errar variable global. Esta variable es un entero y se define en el "Errno.encabezado. Cada vez que se produce un error, se almacena un valor numérico que representa un error particular.
A continuación, observamos las definiciones y el valor representativo de los posibles errores que pueden ocurrir al usar esta función:
Generamos un error en la paterna.Código C, que indica una ruta de archivo inexistente a la execv () función. Luego, use la función printf para mostrar el código de error que se obtiene del errar variable en la consola:
#incluir
#incluir
#incluir
#incluir
#incluir
int main ()
printf ("\ n \ ni am el proceso principal \ n");
char *arg_ptr [5];
arg_ptr [0] = "niño.C";
arg_ptr [1] = "\ nhello de";
arg_ptr [2] = "proceso 2";
arg_ptr [3] = null;
execv ("/home/linuxhint/no existente.bin ", arg_ptr);
printf ("Error: %i \ n", errno);
Como podemos ver en la siguiente figura, la función ExecV () no pudo encontrar el archivo con la ruta especificada y, por lo tanto, se devuelve al proceso principal con el valor 2 en la variable errno que corresponde al "El fichero o directorio no existe" error.
Conclusión
En esto Pista de Linux Artículo, explicamos cómo usar el execv () función en el idioma C para iniciar un proceso desde otro proceso. Explicamos la operación teórica de execv () y mostró cómo declarar los argumentos de entrada.
Luego implementamos lo que aprendimos en un ejemplo, mostrándole cómo crear el programa matriz y el proceso del niño pasando los argumentos de uno a otro. Además, vimos una sección especial donde mostramos los errores más comunes de esta función y cómo identificarlos usando la variable errno.
Esperamos que este artículo sea útil para ti. Para obtener más artículos sobre el lenguaje C y los consejos de Linux, use el motor de búsqueda en nuestro sitio web.