¿Quién bifurca cuando se hace doble clic en las aplicaciones en Linux?

¿Quién bifurca cuando se hace doble clic en las aplicaciones en Linux?

Entonces, sé cuando estoy en Shell y ejecuto un ejecutable, luego Shell lo bifurca en un proceso secundario y luego en un ejecutivo para obtener el programa y la memoria de datos de mi ejecutable. Entonces, si mi shell ahora está cerrado/salido, todos sus procesos secundarios asociados también se eliminarán.

Leí que en Linux cada proceso se crea mediante fork() exec(). Tengo curiosidad y me preguntaba cada vez que se inicia una aplicación al hacer doble clic en su ícono, qué proceso la bifurca () y ejecuta (); entiendo que es algún proceso del sistema operativo, me preguntaba cuál

¡Gracias!

Respuesta lo rastreó hasta /sbin/upstart

Respuesta1

Primero que nada, un poco determinología.

Un ejecutable es un archivo simple en su sistema. Un proceso es la esencia de lo que ejecuta el programa incrustado en un archivo ejecutable.


Tienes razón sobre elforma en que se inicia un archivo ejecutable:

  1. El proceso padre (ya vivo)forks en sí mismo, lo que lleva a dos flujos de ejecución desde ese punto. Uno que vive en el proceso padre y otro que vive en un proceso nuevo y fresco.
  2. El nuevo proceso (secundario) se silencia para ejecutar el programa del ejecutable que se va a ejecutar. Esto se hace usando unllamada al sistemadelexecfamilia.

Tomando el ejemplo de una interfaz gráfica en la que hace doble clic en un ícono ejecutable, su ejecutable se bifurca del proceso y muestra el ícono en el que hizo clic básicamente con este código fuente:

const char *exe_path = taken_from_icon();
int pid = fork();
if(pid == 0)
{
    // I am the new child
    execl(exe_path, exe_path, NULL);
    // exec only return in case of failure
    exit(EXIT_FAILURE);
}
// I am the graphical interface,
// Continue and wait for another clic

Pero elmuerte y paternidaddel niño no es exactamente como usted dice.

Básicamente, y cuando el proceso padre todavía está vivo, el proceso hijo es hijo de su padre (¡sí!-). Tiene su PPID (ID de proceso padre) establecido en el proceso aún vivo que lo bifurcó.

Las cosas cambian cuando el proceso padre muere. El proceso hijo continúa vivo, pero su PPID está configurado para un proceso gran-padre aún vivo. Siempre hay uno ya que initel proceso nunca muere.


El hecho de que los niños del caparazón mueran cuando el propio caparazón muere es algo específico. Veo dos razones para eso:

  • El primero: un shell generalmente mantiene una lista de PID que bifurcó. Y cuando Shell muere, los mata a todos. Los shells principales tienen un disowncomando incorporado para eliminar a un niño de esta lista y dejarlo vivir cuando el shell muere. Verpágina de manual de bash:

    El shell se cierra de forma predeterminada al recibir un SIGHUP. Antes de salir, un shell interactivo reenvía SIGHUP a todos los trabajos, en ejecución o detenidos. Los trabajos detenidos se envían SIGCONT para garantizar que reciban SIGHUP. Para evitar que el shell envíe la señal a un trabajo en particular, debe eliminarse de la tabla de trabajos con el disown incorporado (consulte COMANDOS INTEGRADOS DEL SHELL a continuación) o marcarse para que no reciba SIGHUP usando disown -h.

  • El segundo: los hijos del shell generalmente tienen su stdin, stdout y stderr conectados al shell a través de tuberías. Si el shell deja de consumir la salida estándar secundaria (a menudo para imprimirla) o cierra el extremo de su tubería, entonces la salida secundaria puede tener fallas al escribir en su salida estándar, lo que puede bloquearla o eliminarla.

información relacionada