Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

299
Vistas
Reentrada y reentrada en C?

Estoy leyendo un libro llamado Programación del sistema Linux . Citando de este libro:

¿Qué pasa con las llamadas al sistema y otras funciones de la biblioteca? ¿Qué sucede si su proceso está en medio de la escritura en un archivo o la asignación de memoria, y un controlador de señales escribe en el mismo archivo o también invoca malloc()? Algunas funciones claramente no son reentrantes. Si un programa está en medio de la ejecución de una función no reentrante y se produce una señal y el controlador de la señal invoca esa misma función no reentrante, puede surgir el caos.

Pero luego seguirá:

Funciones de reentrada garantizada

Funciones garantizadas para ser reentrantes de forma segura para su uso en señales

algunas funciones aquí..

escribe()

algunas funciones aquí..

Estoy confundido, ¿es write() reentrante o no? Porque creo que choca con la afirmación:

¿Qué pasa si su proceso está en medio de escribir en un archivo?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Solo para agregar lo que el Sr. @Joachim Pileborg ya mencionó en su respuesta , según la entrada de wiki para Reentrada , las reglas básicas para una función que vuelve a entrar son

  1. El código reentrante no puede contener ningún dato no constante estático (o global).
  2. El código reentrante no puede modificar su propio código.
  3. El código reentrante no puede llamar a rutinas o programas informáticos no reentrantes.

Para elaborar, la función, si vuelve a entrar, no tendrá ningún problema con su propia implementación (induciendo las estructuras de datos internas que usa para sí misma) ya sea que se llame desde un contexto diferente.

Un parámetro (como un descriptor de archivo) que se proporciona a la función no afecta su reentrada.

Entonces, para write() , la función en sí es Reentrante, pero si se llama con el mismo descriptor de archivo desde un hilo diferente, obviamente producirá un resultado erróneo. Una vez más, eso no significa que la reentrada de write() haya desaparecido. Es reentrante , pero no seguro para subprocesos, y estos dos son aspectos diferentes.

over 4 years ago · Santiago Trujillo Denunciar

0

La reentrada tendría más que hacer si pudiera llamar a una función desde diferentes contextos sin perturbar otra llamada desde otro contexto.

Tomemos por ejemplo la función strtok . Por lo general, contiene una variable local static para realizar un seguimiento de la siguiente posición en la cadena que está tokenizando. Dado que las variables static locales se comparten entre todas las llamadas a la función, llamar a la función desde dos contextos diferentes causará problemas.

La llamada del sistema de write , por otro lado, no tiene datos internos que almacene entre llamadas, lo que hace que sea seguro llamar desde diferentes contextos.


Es importante tener en cuenta que reentrante no es lo mismo que seguro para subprocesos. Tome la función de write , por ejemplo, debido a que es reentrante, puede llamarla desde diferentes subprocesos utilizando diferentes archivos sin preocuparse de que los datos internos sean golpeados. Sin embargo, no es seguro para subprocesos. Llamarlo desde diferentes subprocesos utilizando el mismo descriptor de archivo generará problemas.

over 4 years ago · Santiago Trujillo Denunciar

0

La documentación que está citando se refiere a los controladores de señales . Ese es un tipo de función muy específico que se recurre en casos excepcionales y se debe considerar programación de sistemas específicos. Desafían el flujo de control normal en el programa.

Si no está escribiendo manejadores de señales, esta documentación no es realmente útil para usted. Sin embargo, aquí está la lista de funciones que son seguras para la señal en Mac OS:

 $ man sigaction The following functions are either reentrant or not interruptible by signals and are async-signal safe. Therefore applications may invoke them, without restriction, from signal-catching functions: Base Interfaces: _exit(), access(), alarm(), cfgetispeed(), cfgetospeed(), cfsetispeed(), cfsetospeed(), chdir(), chmod(), chown(), close(), creat(), dup(), dup2(), execle(), execve(), fcntl(), fork(), fpathconf(), fstat(), fsync(), getegid(), geteuid(), getgid(), getgroups(), getpgrp(), getpid(), getppid(), getuid(), kill(), link(), lseek(), mkdir(), mkfifo(), open(), pathconf(), pause(), pipe(), raise(), read(), rename(), rmdir(), setgid(), setpgid(), setsid(), setuid(), sigaction(), sigaddset(), sigdelset(), sigemptyset(), sigfillset(), sigismember(), signal(), sigpending(), sigprocmask(), sigsuspend(), sleep(), stat(), sysconf(), tcdrain(), tcflow(), tcflush(), tcgetattr(), tcgetpgrp(), tcsendbreak(), tcsetattr(), tcsetpgrp(), time(), times(), umask(), uname(), unlink(), utime(), wait(), waitpid(), write().
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda