C / UNIX Ejecuta una función una vez cada x milisegundos

¿Cómo ejecuto una función una vez cada 1000 milisegundos usando alarma () o dormir? Quiero que el programa haga otra cosa si la función no se ejecuta o no se completa en 1000 milisegundos.

EDITAR: Pseudocódigo agregado

while(true) {
alarm(1000);
execute function;
sleep(1000);
alarm(0);
}

Ahora, si la alarma (1000) señala SIGALRM, ¿es aquí donde podría llamar a la otra función? Soy nuevo en este tipo de cosas, así que ni siquiera estoy seguro de si las estoy usando correctamente.

preguntado el 16 de mayo de 11 a las 18:05

¿Está buscando una función de Linux / Unix que duerma durante 1 segundo? -

1000 milisegundos no es muy difícil; ¿Necesitaría manejar 200 ms o 1200 ms también? -

Quiero eliminar la deriva acumulativa. Si la función no se ejecuta exactamente una vez durante el período de 1000 milisegundos, el sistema llamará a otra función ... -

3 Respuestas

¿Qué tan nítido es el requisito, es decir, cuánto jitter puede tolerar?

¿Qué versión de UNIX?

Básicamente, si esta es una fecha límite estricta, parece que lo es, tendrá que hacer algunas cosas especiales, porque UNIX básico no es realmente un sistema difícil en tiempo real.

Supongamos por el momento que te refieres a Linux. Querrás

  • utilizado agradable(2) para aumentar la prioridad del proceso
  • use un temporizador de grano fino, como con ualarm(3)

Eso probablemente do. Si necesita una sincronización más precisa, o más predecible, entonces probablemente necesite escribir una extensión del kernel que se pueda manejar con un temporizador del kernel. (Solaris tiene un soporte mejorado para el tiempo real duro, pero todavía no es un sistema en tiempo real complicado).

La vida será considerablemente más fácil si puede utilizar Linux o UNIX en tiempo real. Aquí está un lista de algunas opciones. Aquí hay un artículo que puede encontrar usefui.

Noticias

También deberías mirar nanosueño(2) or temporizador(2). Observe que todos estos dicen que el intervalo es al menos el del argumento. Si tiene una fecha límite estricta, debe esperar algo menos que el intervalo real y luego averiguar qué hacer con cualquier cambio en sus mil milisegundos.

contestado el 16 de mayo de 11 a las 23:05

He usado esta función en Linux para "dormir" en milisegundos:

void Sleep(unsigned int milliSeconds)
{
    struct timespec req = {0};

    time_t seconds  = (int) (milliSeconds / 1000);
    milliSeconds    = milliSeconds - (seconds * 1000);
    req.tv_sec      = seconds;
    req.tv_nsec     = milliSeconds * 1000000L;

    while (nanosleep(&req, &req) == -1)
        continue;
}

contestado el 16 de mayo de 11 a las 23:05

while (1) {
    sleep(1);
    /* Act */
}

Si necesita retrasos más estrictos, la forma normal de hacerlo es llamar a select () sin fds y con un tiempo de espera bajo.

contestado el 16 de mayo de 11 a las 22:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.