¿Diferencia entre “sistema” y “ejecutivo” en Linux?

5 minutos de lectura

avatar de usuario
kamil

Cuál es la diferencia entre system y exec mandatos familiares? ¿Especialmente quiero saber cuál de ellos crea un proceso secundario para que funcione?

avatar de usuario
carl norum

system() llama a sh para manejar su línea de comando, para que pueda obtener una expansión de comodines, etc. exec() y sus amigos reemplazan la imagen de proceso actual con una nueva imagen de proceso.

Con system(), su programa continúa ejecutándose y obtiene algún estado sobre el comando externo que llamó. Con exec()su proceso se borra.

En general, supongo que se podría pensar en system() como una interfaz de nivel superior. Podría duplicar su funcionalidad usted mismo usando alguna combinación fork(), exec()y wait().

Para responder a su pregunta final, system() hace que se cree un proceso hijo, y el exec() la familia no. Necesitarías usar fork() para eso.

  • hace el system call genera un nuevo shell también para ejecutar el comando dado o ejecuta el comando en el mismo shell.

    – Krishna Ozá

    5 de octubre de 2016 a las 9:51

  • @Krishna_Oza – no hay “mismo shell”, a menos que el programa llame system() es en sí mismo un caparazón. No estoy seguro de seguir. Mi documentación aquí dice: “El system() la función entrega el comando de argumento al intérprete de comandos sh(1).”

    –Carl Norum

    5 oct 2016 a las 16:36

  • Cita de system Manual de POSIX: los system() La función se comportará como si se hubiera creado un proceso hijo utilizando fork()y el proceso hijo invocó la utilidad sh usando execl() como sigue: execl(<shell path>, "sh", "-c", command, (char *)0);.

    – patryk.beza

    26 de diciembre de 2016 a las 9:06


La función exec reemplaza la imagen del proceso que se está ejecutando actualmente cuando tiene éxito, no se crea ningún elemento secundario (a menos que lo haga usted mismo previamente con fork()). La función system() bifurca un proceso secundario y regresa cuando el comando proporcionado termina de ejecutarse o se produce un error.

system() ejecutará el comando proporcionado en un proceso secundario que genera. exec() reemplazará el proceso actual con la invocación del nuevo ejecutable que especifique. Si desea generar un proceso hijo usando exectendrás que fork() su proceso de antemano.

Para crear un proceso:

  • fork(2)una llamada al sistema directamente al kernel

Para ejecutar un programa, reemplazando la imagen actual:

  • execve(2)una llamada del sistema directamente al kernel, generalmente llamada simplemente exec

Para esperar a que finalice un proceso hijo:

  • wait(2)una llamada al sistema directamente al kernel

Para ejecutar un programa en un shell en un proceso secundario y esperar a que finalice:

  • system(3)una función de biblioteca

Para obtener el páginas man por todo lo anterior:

   $ man 2 fork execve wait
   $ man 3 system

avatar de usuario
clifford

system() invocará el shell de comandos predeterminado de su sistema, que ejecutará la cadena de comando pasada como argumento, que en sí misma puede o no crear más procesos, que dependerán del comando y del sistema. De cualquier manera, se creará al menos un proceso de shell de comandos.

Con system() puede invocar cualquier comando, mientras que con exec(), solo puede invocar un archivo ejecutable. Los scripts de shell y los archivos por lotes deben ejecutarse mediante el shell de comandos.

Básicamente, son completamente diferentes y se utilizan para diferentes propósitos. Además, exec() reemplaza el proceso de llamada y no regresa. Una comparación más útil sería entre system() y spawn(). Si bien el sistema puede ser más simple de invocar, devuelve un valor que le indica si se invocó el shell de comando y no le dice nada sobre el éxito del comando en sí. Con spawn() puede obtener el código de salida del proceso; por convención, se utiliza un valor distinto de cero para indicar condiciones de error. Al igual que exec(), spawn() debe invocar un ejecutable, no un script de shell o un comando integrado.

avatar de usuario
Kalpesh Dusane


int system(const char *cmdstring);

Ex: system("date > file");


En general, sistema se implementa llamando bifurcación, exec y waitpidhay tres tipos de valores devueltos.

  • Si la bifurcación falla o waitpid devuelve un error que no sea EINTR, el sistema devuelve –1 con errno establecido para indicar el error.
  • Si el exec falla, lo que implica que el shell no se puede ejecutar, el valor devuelto es como si el shell hubiera ejecutado exit(127).
  • De lo contrario, las tres funciones (fork, exec y waitpid) tienen éxito y el valor de retorno del sistema es el estado de finalización del shell, en el formato especificado para waitpid.

los tenedor La función es crear un nuevo proceso (el niño) que luego hace que se ejecute otro programa llamando a uno de los ejecutivo funciones Cuando un proceso llama a una de las funciones exec, ese proceso es completamente reemplazado por el nuevo programa, y ​​el nuevo programa comienza a ejecutarse en su función principal. El ID del proceso no cambia en un exec, porque no se crea un nuevo proceso; exec simplemente reemplaza el proceso actual (sus segmentos de texto, datos, montón y pila) con un nuevo programa desde el disco.

Hay seis funciones ejecutivas diferentes,


int execl(const char *pathname, const char *arg0, ... /* (char *)0 */ );

int execv(const char *pathname, char *const argv []);

int execle(const char *pathname, const char *arg0, .../* (char *)0, char *const envp[] */ );

int execve(const char *pathname, char *const argv[], char *const envp []);

int execlp(const char *filename, const char *arg0,... /* (char *)0 */ );

int execvp(const char *filename, char *const argv []);

avatar de usuario
Morfeo

exec() reemplaza el proceso en ejecución actual con la imagen del proceso de la función que se está realizando… solo se pueden invocar archivos ejecutables usando esto.

system() bifurca implícitamente un nuevo proceso para atender la solicitud y devuelve el valor que obtuvo a través del proceso secundario que bifurcó inicialmente. Utiliza el shell predeterminado del sistema para llevar a cabo la operación.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad