Какая функция ядра вызывается для timer_settime () и обработчика таймера, реализованного в пространстве пользователя? - PullRequest
0 голосов
/ 25 декабря 2018

У меня есть многопоточная программа, в которой я создал таймер в главном потоке, используя функцию timer_create().Затем я установил таймер с помощью функции timer_settime().Когда таймер истек после истечения времени таймера, он вызвал зарегистрированную функцию обработчика таймера.

Вот мой фрагмент кода:

#define CLOCKID CLOCK_REALTIME
#define SIG SIGRTMIN
int ret;
timer_t timerid;
struct sigevent sev;
struct itimerspec its;

sigset_t mask;
struct sigaction sa;


static void handler(int sig, siginfo_t *si, void *uc)
{

}

void *threadA(void *data_)
{

      while(1)
      {

        its.it_value.tv_sec = 0;
        its.it_value.tv_nsec = DELAY1;
        its.it_interval.tv_sec = 0;
        its.it_interval.tv_nsec = 0;

        ret = timer_settime(timerid, 0, &its, NULL);
        if ( ret < 0 )
            perror("timer_settime");
     }
}

int main(int argc, char *argv[])
{
      sa.sa_flags = SA_RESTART;
      sa.sa_sigaction = handler;
      sigemptyset(&sa.sa_mask);
      err = sigaction(SIG, &sa, NULL);
      if (0 != err) {
           printf("sigaction failed\n"); }

      sev.sigev_notify = SIGEV_SIGNAL;
      sev.sigev_signo = SIG;
      sev.sigev_value.sival_ptr = &timerid;
      ret = timer_create(CLOCKID, &sev, &timerid);
      if ( ret < 0 )
           perror("timer_create");

}

Я хочу знать, какие функции вызываются в пространстве ядра,когда я вызываю timer_create(), timer_settime() внутри моей программы на языке C.

Кроме того, какая функция ядра отвечает за вызов обработчика таймера по истечении таймера?

Внутри include/linux/posix-clock.h файл, я нашел следующие определения, но не определил эти функции.

/**
 * struct posix_clock_operations - functional interface to the clock
 * @timer_create:   Create a new timer

 * @timer_settime: Set a timer's initial expiration and interval
 */     

struct posix_clock_operations {
    struct module *owner;

    int  (*timer_create) (struct posix_clock *pc, struct k_itimer *kit);



    int  (*timer_settime)(struct posix_clock *pc,
                          struct k_itimer *kit, int flags,
                          struct itimerspec *tsp, struct
                          timerspec *old);

1 Ответ

0 голосов
/ 26 декабря 2018

strace вашей программы, и вы увидите, какие системные вызовы используются.

В некоторых случаях это может зависеть от вашего libc, поскольку ядро ​​часто предлагает несколько способов достижения чего-либо.

...