El uso de la función ejecutiva

Sobre el uso de la función exec en el proceso

Problemas encontrados en el proceso de aprendizaje:

  • ¿cómo utilizar?
  • ¿Cual es la diferencia?
  • ¿Cual es el rol?

1. ¿Cómo se usa?

En el sistema Linux, podemos usar el comando man para ver:

P.ej:

查看man命令的使用   		man man

SECCIONES DEL MANUAL:

   The standard sections of the manual include:

   1      User Commands
   2      System Calls
   3      C Library Functions
   4      Devices and Special Files
   5      File Formats and Conventions
   6      Games et. Al.
   7      Miscellanea
   8      System Administration tools and Daemons

查看exec函数使用			man 3 exec

NOMBRE: (toda la familia de funciones ejecutivas)

   execl, execlp, execle, execv, execvp - execute a file

SINOPSIS:

   #include <unistd.h>(头文件)

   extern char **environ;

La forma específica de la familia de funciones ejecutivas:

   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[]);

2. ¿Cuál es la diferencia?

  • El nombre de la función es diferente (esto es una tontería)
  • Los parámetros son diferentes
  • Diferentes métodos de uso

Aquí, comparamos estas dos funciones para usar: (otras funciones son similares)

  • int execl (const char * ruta, const char * arg,…);
  • int execlp (const char * archivo, const char * arg,…);

¡Todo en el sistema Linux es un archivo! ! !

¡Todo en el sistema Linux es un archivo! ! !

¡Todo en el sistema Linux es un archivo! ! !

Ejemplos:

Utilice execlp

 #include<stdio.h>
 #include<unistd.h>
 int main ()
 {
  printf("==调用 execl 函数==\n");
  execlp("ls","-l","/home/hadoop",(char *)0);
  printf("excel error\n");
  return 0;
 }

Utilice execlp

 #include<stdio.h>
 #include<unistd.h>
 int main ()
 {
  printf("==调用 execl 函数==\n");
  execl("/bin/ls","ls","-l","/home/hadoop",(char *)0);
  printf("excel error\n");
  return 0;
 }  

Al comparar los resultados de ejecución, encontramos que los resultados de ejecución de las dos funciones son iguales. En otras palabras, la clave es usar, y no es difícil ver que los dos parámetros de función son diferentes, uno se llama la ruta y el otro es el nombre del archivo directamente .

Algunas personas también preguntarán si ls no es una instrucción. ¿Se pueden llamar instrucciones?

Respuesta: ¡ Todo en el sistema Linux es un archivo! ! !

Si aún tienes dudas, es mejor que te subas a la máquina para hacer el experimento. Conocimiento real de la práctica

3. ¿Cuál es el papel?

La función exec está configurada para ejecutar una sección de otros programas en el proceso.

pid=fork();

Esta oración es para crear un proceso hijo. Después de eso, los procesos padre e hijo ejecutarán los bloques de código por separado.

prueba:

pid=fork();
printf("Hello World!");

¿Puede ver cuántas veces se ha emitido esta oración? (¡Pruébelo usted mismo!)

De esto podemos saber que algo como esto sucederá cuando se ejecute la función fork ():

fork
父进程
子进程

Inserte la descripción de la imagen aquí

Dado que existe una distinción entre un proceso principal y un proceso secundario, ¿cómo se puede distinguir entre un proceso principal y uno secundario?

Puntos de conocimiento de la función fork ():

不需要参数并返回一个整数值。下面是fork()返回的不同值。

负值:创建子进程失败。

零:  返回到新创建的子进程。

正值:返回父母或来电者。该值包含新创建的子进程的进程ID。

Entonces podemos hacer esto:

pid=fork();
if(pid == 0)
{
	//执行代码
}
if(pid > 0)
{
	//执行代码
}

En este punto, nuestra función ejecutiva protagonista está en escena: la función se puede llamar durante la ejecución del código.


Ejemplos:

  1 #include<unistd.h>
  2 #include<stdio.h>
  3 #include<sys/types.h>
  4 #include<sys/stat.h>
  5 #include<stdlib.h>
  6 int main()
  7 {
  8     int fd[2],flag;
  9         flag=pipe(fd);
 10     if(flag==-1)
 11     {
 12         printf("pipe creat error\n");
 13         exit(-1);
 14     }
 15     pid_t pid;
 16     pid=fork();
 17     if(pid==0)
 18     {
 19         char *mess;
 20         read(fd[0],mess,10);
 21         printf("pid=%d\n",getpid());
 22         printf("play execl:\n");
 23         execl("/bin/ls","ls",mess,"/home",(char*)0);
 24         printf("excel error\n");
 25     }
 26     if(pid>0)
 27     {
 28         char *message;
 29         message="-l";
 30         //传输参数:-l
 31         write(fd[1],message,9);
 32     }
 33     return 0;
 34 }

El contenido anterior implica tuberías sin nombre, y los lectores interesados ​​pueden averiguarlo. El punto es mirar la función execl en el proceso hijo. Si la función se ejecuta con éxito, la instrucción printf ("error de excel \ n"); la instrucción en la línea 24 no se ejecutará, por el contrario (la ejecución de excel falló) ser ejecutado . Por lo tanto, el contenido de la subrutina (debajo de la función de Excel) será reemplazado por el contenido ejecutado por la función execl. En este caso, es

[root@cent0 home]# ls (目录:home 命令:ls <==> execl)
hadoop  mydir (是这条语句哦!)

Estará cubierto por esta declaración. (Pruébelo usted mismo, tal vez lo sorprenda, ¡así es!)

Lo anterior es el contenido de hoy, espero que pueda ayudarlos a todos.
(El editor también comenzó desde Xiaobai. ¡Haga más preguntas, estudie más y trabaje más y gradualmente tendrá ideas!)

2019/10/26 13:31:49

Supongo que te gusta

Origin blog.csdn.net/HG0724/article/details/102755679
Recomendado
Clasificación