Linux execl learning

  

Linux bajo el archivo
#include < unistd.h >

definición de función para int execl (const char * path, const char * arg, ...);

Descripción de la función
execl () donde sufijo " l " significa list es también el significado de la lista de parámetros; el primer puntero del parámetro de ruta del parámetro apunta a la ruta del archivo que se ejecutará; Lista: argv [0], argv [1] ... El último parámetro debe terminar con un puntero nulo NULL.

Valor de retorno de la función
El éxito no devuelve un valor, el error devuelve -1, el motivo del error se almacena en errno y se puede imprimir con perror ():

 root @ wl-MS-7673: /home /Wl /desktop /c ++ # cat -n execl.cpp 1 /* Ejecutar /bin /ls -al /ect /passwd * /2 #include < unistd.h > /*** Archivo: execl.c ** /3 #include < iostream > 4 usando namespace std; 5 int main () 6 {7 //Ejecute ls en el directorio /bin, el primer parámetro es el nombre del programa ls, y el segundo parámetro es " -al ", tercero El argumento es "/etc /passwd" 8 9 if (execl ("/bin /ls", "ls", "-al", "/etc /passwd", (char *) 0) < 0) 10 11 {12 cout < < &ex; error de ejecución < < < < 13} 14 else 15 {16 cout < < " " < < < < endl; 17} 18 return 0; 19 } root @ wl-MS-7673: /home /wl /desktop /c ++ # g ++ execl.cpp -o execlroot @ wl-MS-7673: /home /wl /desktop /c ++ # ./execl -rw-r-- R-- 1 raíz raíz 1801 28 de noviembre 09:46 /etc /passwdroot @ wl-MS-7673: /home /wl /desktop /c ++ # Puede ver claramente que se ejecuta ls en el directorio /bin, el primer parámetro es el nombre del programa ls, el segundo parámetro es " -al ", y el tercer parámetro es " /etc /passwd ", pero ningún resultado de salida! ! Porque es esto Características de la función execl: cuando un proceso llama a una función exec, el proceso es reemplazado completamente por el nuevo programa, y ​​el nuevo programa se ejecuta desde su función principal. Debido a que llamar a exec no crea un nuevo proceso, los ID de proceso antes y después no han cambiado. Exec simplemente reemplaza los segmentos de cuerpo, datos, pila y pila del proceso actual con otro programa nuevo. Reemplace los segmentos de cuerpo, datos, montón y pila del proceso actual con otro programa nuevo. El cuerpo del proceso actual ha sido reemplazado, luego la declaración después de execl, incluso si execl exits, no se ejecutará. Mire una parte del código: 
 root @ wl-MS-7673: /home /wl /desktop /c ++ # cat -n execl_test.cpp 1 #include < unistd.h > 2 #include < stdio.h > 3 #include < stdlib.h > 4 5 int main (int argc, char * argv []) 6 {7 if (argc < 2) 8 {9 perror (" no tiene, t ingresa el nombre de archivo, por favor intente nuevamente! \\ n "); 10 exit (EXIT_FAILURE); 11 12} 13 if (execl (" ./file_creat ", " file_creat ", argv [1], NULL) < 0) 14 perror (" execl error! "); 15 return 0; 16} 17 root @ wl-MS-7673: /home /wl /desktop /c ++ # cat -n file_creat.cpp 1 #include < stdio.h > 2 3 #include < stdlib .h > 4 5 #include < sys /types.h > 6 #include < sys /stat.h > 7 #include < fcntl.h > 8 void create_file (char * filename) 9 {10 if (creat ( Nombre de archivo, 0666) < 0) 11 {12 printf (" ¡cree el archivo% s error! \\ N " nombre de archivo); 13 exit (EXIT_FAILURE); 14 } 15 else 16 {17 printf (" crea el archivo% s éxito! \\ N " nombre de archivo); 18} 19} 20 21 int main (int argc, char * argv []) 22 {23 if (argc < 2) 24 {25 printf (" no ha ingresado el nombre de archivo, inténtelo de nuevo! \\ N "); exit (EXIT_FAILURE); 27} 28 create_file (argv [1]); 29 exit (EXIT_SUCCESS); 30} 31 32 root @ wl-MS-7673: /home /wl /desktop /c ++ # g ++ execl_test.cpp -o execl_testroot @ wl-MS-7673: /home /wl /desktop /c ++ # g ++ file_cfile_copy file_copy.cpp file_creat.cpp root @ wl-MS-7673: /home /wl /desktop /c ++ # g ++ file_creat.cpp -o file_creatroot @ wl-MS-7673: /home /wl /desktop /c ++ # ./execl_test no tiene, ingrese el nombre del archivo, ¡Inténtalo de nuevo !: Successroot @ wl-MS-7673: /home /wl /desktop /c ++ # ./execl_test archivo de archivos exitosos! Root @ wl-MS-7673: /home /wl /desktop /c ++ #
						

Copyright © Conocimiento de Windows All Rights Reserved