Pregunta

Al igual que en este pregunta , me gustaría limitar el tiempo de ejecución de una función - preferentemente con una precisión de microsegundos - en C. imagino que C excepciones ++ podrían utilizarse para lograr un resultado similar a esta solución Python. Aunque no es ideal, este enfoque es totalmente disponible en C plano.

Me pregunto, entonces, ¿cómo podría yo interrumpir la ejecución de una función después de un cierto intervalo de tiempo en C en un sistema POSIX? Para situaciones relativamente simples un poco de negocio tonta funciona muy bien, pero que añade una buena cantidad de código ortogonal a la solución del problema. Digamos que tengo una función de este modo:

void boil(egg *e) {
    while (true)
    do_boil(e);
}

Quiero correr ebullición ejecutarse en un huevo *, interrumpiendo cada 50ms para comprobar hacer algo así:

egg *e = init_egg();
while (true) {
    preempt_in(50, (void) (*boil), 1, e);
    /* Now boil(e) is executed for 50μs, 
       then control flow is returned to the
       statement prior to the call to preempt_in.
     */
    if (e->cooked_val > 100)
        break;
}

Me da cuenta de que pthreads se podrían utilizar para hacer esto, pero estoy más interesado en evitar su uso. I podría cambiar entre ucontext_t está en un controlador SIGALRM, pero las notas estándar POSIX que el uso de setcontext / swapcontext no debe ser utilizado en un manejador de señales y, de hecho, observo diferentes comportamientos entre Linux y Solaris sistemas antes de hacerlo.

¿Es este efecto posible a lograr? Si es así, de una manera portátil?

¿Fue útil?

Solución

Sólo tener en cuenta que la capacidad general de que estés buscando aquí se llama autoridades coste . Por ejemplo, véase este artículo de Wellings o en Leung , et. al. gran libro. Las respuestas anteriores se centran en lograr que en el espacio de usuario; algunos RTOS o lenguas apoyan (no Linux) como un mecanismo general.

Un ejemplo OS que proporciona esta es la AUTOSAR OS (spec vinculado) . Tenga en cuenta que este sistema operativo proporciona aplicación de tiempo de ejecución , que es ligeramente diferente de autoridades plazo. aplicación de tiempo de ejecución se pone cada vez más difícil, ya que se basa en una cierta capacidad para medir el costo real gastada (por lo general con la cooperación de hardware). Con la complejidad de los procesadores de hoy en día, es difícil y costoso medir esto - por no hablar de que el significado de las mediciones (debido a la ejecución no lineal y todo tipo de otras cosas interesantes) son difíciles de interpretar - y por lo tanto caso difícil de calcular una ( más desfavorable o común-) estimación caso de una sección particular de tiempo de ejecución del código.

Un poco fuera de tema, pero Ada proporciona un conjunto más riguroso de las capacidades a nivel de lenguaje de aquí, que no le ayuda, pero se puede averiguar cómo se han implementado estos requisitos Ada en Linux. La especificación de lenguaje Ada es único en la prestación de un documento de justificación, consulte la sección tiempo real preventivo de aborto como punto de partida.

Otros consejos

o bien puede utilizar hilos, o tienen la función de sondeo de un temporizador (o un conjunto de variables globales en handler SIGALRM), a continuación, guardar su estado y de salida cuando ha expirado el tiempo asignado. El uso de ucontext_t es obsoleto y no debe utilizarse en el nuevo código, en absoluto, mucho menos de los gestores de señales.

La solución deseo de repente se me ocurre: Goto! Voy a configurar un punto de salto justo después de la función Deseo límite, establecer un temporizador y en el manejador de la señal, que se ocupa de la SIG * ALRM simplemente saltar a la instrucción después de la función.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top