Linux: reemplazo de programa

Reemplazo del programa

Reemplazo de programa simplemente significa volver a cargar otro programa en la memoria; luego apunte el puntero de memoria de un PCB existente al espacio de memoria para señalar el nuevo programa, y ​​luego el PCB existente se ejecutará para programar el nuevo programa.

Principio de sustitución

Después de que el proceso hijo se crea con fork, ejecuta el mismo programa que el proceso padre (pero puede ejecutar diferentes ramas de código), y el proceso hijo a menudo llama a una función ejecutiva
para ejecutar otro programa. Cuando un proceso llama a una función ejecutiva, el código de espacio de usuario y los datos del proceso son reemplazados por completo por el nuevo programa, y ​​la
ejecución comienza desde la rutina de inicio del nuevo programa . Llamar a exec no crea un nuevo proceso, por lo que la identificación del proceso no cambia antes y después de llamar a exec.
Inserte la descripción de la imagen aquí

Método de reemplazo

La implementación del reemplazo del programa se realiza principalmente a través de la familia de funciones exec, que se refiere a 6 tipos de funciones que comienzan con exec

#include <unistd.h>`//头文件
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 execvp(const char *path, char *const argv[],char *const envp[]);

Nota : Si estas funciones se llaman con éxito, se cargará y ejecutará un nuevo programa desde el código de inicio, y no regresará. Si la llamada falla, devolverá -1, por lo que la función exec solo tiene un valor de retorno de error pero no valor de retorno de éxito.

Ley de función

Como podemos ver en lo anterior, estos prototipos de funciones tienen el mismo aspecto y es fácil confundirse, pero de hecho hay ciertas reglas entre ellos, siempre que dominemos estas reglas, es fácil distinguirlas.

l(list) : 表示参数采用列表
v(vector) : 参数用数组
p(path) : 有p自动搜索环境变量PATH
e(env) : 表示自己维护环境变量
Nombre de la función Formato de parámetro Con camino Ya sea para usar variables de entorno actuales
execl Lista No es
execlp Lista
execle Lista No es No, necesita ensamblar las variables de entorno usted mismo
execv Formación No es
execvp Formación
ejecutivo Formación No es No, necesita ensamblar las variables de entorno usted mismo

Resumen :
De hecho, en general, es
(1) la diferencia entre lyv: el método de asignación de parámetros operativos del programa es diferente
(2) si hay una diferencia entre p: si el nombre del nuevo archivo de programa debe tener una ruta
(3) si existe e Diferencia: si personalizar las variables de entorno
Ejemplo:

     #include <stdio.h>                                                           
     #include <stdlib.h>
     #include <unistd.h>
     
     int main()
     {
    
    
       pid_t pid = fork();
       if(pid < 0)

      {
    
              
        perror("fork");
        return -1;     
      }           
      else if(0 == pid)
      {
    
                    
       
        char *const argv[] = {
    
    "ps","-ef",NULL};
        char *const envp[] = {
    
    "PATH=/bin:/usr/bin", "TERM=console",NULL};
        execl("/bin/ps","ps","-ef",NULL);                                
                                         
        execlp("ps","ps","-ef",NULL,envp);
                                          
        execle("ps","ps","-ef",NULL,envp);
                                          
        execv("/bin/ps",argv);
                              
        execvp("ps",argv);
                          
        execve("/bin/ps",argv,envp);
        sleep(30);                  
        exit(0);  
      }         
      else
      {
    
       
        sleep(30);
        printf("子进程退出!\n");                                                                                                                               
        while(1)  
        {
    
           
          printf("正在打麻将!\n");
        }                          
      }  

Supongo que te gusta

Origin blog.csdn.net/qq_43825377/article/details/113833817
Recomendado
Clasificación