¿Bash llama a `execve()` sin realizar más cambios en cómo `execve()` trata las disposiciones de las señales?

¿Bash llama a `execve()` sin realizar más cambios en cómo `execve()` trata las disposiciones de las señales?

El manual de Bash dice

Cuando se va a ejecutar un comando simple que no sea una función incorporada o del shell, ... las trampas capturadas por el shell se restablecen alos valores heredados del padre del shelly las trampas ignoradas por el shell se ignoran

página de manual execve()dice

Durante un execve(2), las disposiciones de las señales manejadas se restablecen ael valor por defecto; las disposiciones de las señales ignoradas no se modifican."

¿Son iguales "los valores predeterminados" y "los valores heredados del padre del shell"?

¿Bash llama execve()sin realizar más cambios en la forma en que execve()trata las disposiciones de las señales?

Gracias.

Respuesta1

No, "el valor predeterminado" y "los valores heredados del padre del shell" no son lo mismo. En el caso de execve, "el valor predeterminado" se refiere a SIG_DFL, lo que provoca la acción predeterminada según lo especificado porman 7 signal. En el caso de bash, "los valores heredados del padre del shell" significan exactamente lo que dice; Si dicha señal fue ignorada ( SIG_IGN) por su padre, también será ignorada por su hijo.

Una clave para entender lo que está pasando aquí es la palabra "manejado". Se refiere a una función de manejo de señales personalizada, distinta de SIG_DFLo SIG_IGN. Debe restablecerlo mediante execve, ya que el nuevo proceso no tendrá la función de controlador de señales que usaba el proceso anterior.

Tenga en cuenta que las versiones más recientes de la página de manual de execve se refieren a las señales "manejadas" como señales "captadas", para estar en línea con la terminología utilizada por el resto de Linux. Esto sigue siendo distinto de las señales predeterminadas e ignoradas.

Versión simple: si bash o el padre de bash tenían una señal marcada como SIG_IGN, también estará SIG_IGNen el nuevo hijo. De lo contrario, estará SIG_DFLen el nuevo niño. Nunca puede ser un controlador en el nuevo hijo, ya que no existirá ningún controlador de bash o su padre en el nuevo hijo.

información relacionada