[LINUX] miniShell (función de reemplazo)

miniShell (función de reemplazo)

antecedentes

A menudo escribimos varios comandos como este en Linux.
Inserte la descripción de la imagen aquí
Pero, ¿sabemos cómo la capa inferior reconoce la ejecución?

Introducción

Utilice el eje de tiempo en la figura siguiente para mostrar la secuencia de eventos. El tiempo es de izquierda a derecha. El caparazón está representado por un cuadrado etiquetado como sh, que se mueve de izquierda a derecha a lo largo del tiempo. El shell lee la cadena "ls" del usuario. El shell crea un nuevo proceso, luego ejecuta el programa ls en ese proceso y espera a que termine el proceso.

Inserte la descripción de la imagen aquí
El shell lee una línea de entrada, crea un nuevo proceso, ejecuta el programa en este proceso y espera a que finalice el proceso. Entonces, para escribir un shell, necesita repetir el siguiente programa.

1. Obtén la línea de comando
2. Analizar la línea de comando
3. Cree un proceso hijo (bifurcación)
4. Reemplazar el proceso hijo (execvp)
5. El proceso padre espera a que salga el proceso hijo (esperar)

Código

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include <sys/wait.h>
int main()
{
    
    
  char cmd[256];
  const char *cmd_line = "[anton@VM-centos]#";
  while(1)
  {
    
    
    cmd[0]=0;
    printf("%s",cmd_line);
    fgets(cmd,256,stdin);
    cmd[strlen(cmd)-1]='\0';
    char *args[16];
    args[0]=strtok(cmd," ");
    int i=1;
    do{
    
    
      args[i]=strtok(NULL," ");
      if(args[i]==NULL)
      {
    
    
        break;
      }
      i++;
    }while(1);
    pid_t id=fork();
    if(id<0)
    {
    
    
      perror("fork error\n");
    }
    if(id==0)
    {
    
    
      execvp(args[0],args);
      exit(1);
    }
    else if(id>0)
    {
    
    
      wait(NULL);
    }
  }
  return 0;
}

Se presentan los resultados:
Inserte la descripción de la imagen aquí

Funciones y procesos

exec / exit es como llamar / regresar
Un programa en C consta de muchas funciones. Una función puede llamar a otra función y pasarle algunos parámetros al mismo tiempo. La función llamada realiza una determinada operación y luego devuelve un valor. Cada función tiene sus variables locales y diferentes funciones se comunican a través del sistema de llamada / devolución. Este modo de comunicación entre funciones con datos privados a través de parámetros y valores de retorno es la base de la programación estructurada. Linux fomenta la extensión de este modelo aplicado dentro de programas entre programas. Como se muestra en la figura siguiente,
Inserte la descripción de la imagen aquí
un programa en C puede bifurcar / ejecutar otro programa y pasarle algunos parámetros. El programa llamado realiza ciertas operaciones y luego devuelve el valor a través de exit (n). El proceso que lo llama puede obtener el valor de retorno de exit mediante wait (& ret).

Supongo que te gusta

Origin blog.csdn.net/weixin_43762735/article/details/115053073
Recomendado
Clasificación