Question

Dans le même à cette question , je voudrais limiter le temps d'exécution d'une fonction - de préférence avec une précision de microseconde - en C. Je suppose que C ++ exceptions pourraient être utilisées pour obtenir un résultat similaire à cette solution Python. Bien que ce n'est pas idéal, une telle approche est tout à fait disponible dans C ordinaire.

Je me demande, alors, comment pourrais-je interrompre l'exécution d'une fonction après un certain intervalle de temps en C sur un système Posix? Pour des situations relativement simples un peu de entreprise stupide fonctionne très bien, mais qui ajoute un montant équitable code orthogonal à la solution du problème. Disons que j'ai une fonction comme ceci:

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

Je veux courir courir furoncle sur un œuf *, interrompant toutes les 50µs pour vérifier faire quelque chose comme ceci:

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;
}

Je me rends compte que pthreads pourraient être utilisés pour ce faire, mais je suis un peu plus intéressés à éviter leur utilisation. I peut basculer entre ucontext_t est dans un gestionnaire SIGALRM, mais les notes standard POSIX que l'utilisation de setcontext / swapcontext ne doit pas être utilisé dans un gestionnaire de signal et, en effet, je constate différents comportements entre Linux et Solaris systèmes en le faisant.

Est-ce l'effet possible pour atteindre? Si oui, de manière portable?

Était-ce utile?

La solution

Juste à noter que la capacité générale que vous cherchez ici est appelé l'application des coûts . Par exemple, voir cet article par Wellings ou dans Leung , et. grand livre al.. Les réponses ci-dessus sont axées sur la réalisation dans l'espace utilisateur; certains RTOS ou les langues soutiennent (non linux) comme mécanisme général.

Un exemple OS qui fournit c'est le AUTOSAR OS (spécifications liées) . Notez que ce système d'exploitation offre application de temps d'exécution , ce qui est légèrement différent de application de la date limite. application de temps d'exécution continue devient plus difficile, car il repose sur une capacité à mesurer le coût réel dépensé (généralement avec la coopération matérielle). Avec la complexité des processeurs d'aujourd'hui, il est difficile et coûteux de mesurer cela - pour ne pas mentionner que le sens des mesures (en raison de l'exécution non linéaire et toutes sortes d'autres trucs cool) sont difficiles à interpréter - et donc l'événement difficile à calculer un ( le plus défavorable ou de fait) estimation de cas d'une section particulière de la durée d'exécution du code.

Un peu hors-sujet, mais Ada fournit un ensemble plus rigoureux des capacités au niveau de la langue ici, qui ne vous aide, mais vous ne pouviez pas comprendre comment ces exigences Ada ont été mises en œuvre sous Linux. La spécification du langage Ada est unique dans la fourniture d'un document de justification, voir la section en temps réel préemptif abort comme point de départ.

Autres conseils

Vous pouvez utiliser des fils, ou ont le scrutin fonction d'une minuterie (ou un ensemble variable globale par gestionnaire de SIGALRM), puis enregistrer son état et de sortie lorsque le temps imparti est écoulé. L'utilisation de ucontext_t est dépréciée et ne doit jamais être utilisé dans le nouveau code, tout, beaucoup moins de gestionnaires de signaux.

La solution que je désire se produit soudainement à moi: goto! Je vais installer un point de saut juste après la fonction que je veux limiter, régler une minuterie et dans le gestionnaire de signal qui traite du SIG * ALRM simplement sauter à l'instruction après la fonction.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top