在timer_start()睡眠后C无法正常工作

时间:2018-08-14 12:24:26

标签: c timer sleep usleep

我在ubuntu上使用eclipse IDE编译我的c项目。我有一个计时器。启动计时器后,睡眠或非睡眠功能不起作用。 这是代码;

编辑

/*
 ============================================================================
 Name        : TimerTest.c
 Author      : FK
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>         /* , getenv() */
#include <getopt.h>
#include <unistd.h>         /* exec(), daemon() */
#include <stdint.h>
#include <string.h>         /* memset(), strerror() */
#include <errno.h>          /* errno */
#include <libgen.h>         /* basename() */
#include <signal.h>
#include <sys/timex.h>      /* ntp_gettime() */
#include <time.h>

#include "timer/timer.h"

#define CONFIG_TIMER_INTERVAL   100 /* in ms */
/* global vars decalarations */

static uint8_t _terminate = 0;
static int _signo = 0;

static int init_prg(int argc, char *argv[]);
static void timer_callback(void);

/* function implementations */
static void sig_handler(int signo)
{
    /* http://www.yolinux.com/TUTORIALS/C++Signals.html */
    _signo = signo;
    switch (signo)
    {
        case SIGINT: /* Program interrupt. (ctrl-c) */

            _terminate = 1;
            break;
        case SIGTERM:

            _terminate = 1;
            break;
            /* SIGKILL, SIGSTOP yakalanımıyor! */
        default:

            break;
    }

}

int main(int argc, char *argv[])
{
    init_prg(argc, argv);
    /* start super loop */
    while (1)
    {
        printf("test!\n");
        //usleep(1000000);
        sleep(1);

    }
}

static int init_prg(int argc, char *argv[])
{
    int res = -1;

    if (signal(SIGINT, sig_handler) == SIG_ERR)
    {
        //exit(EXIT_FAILURE);
    }

    /* Termination, Generated by "kill" command. */
    if (signal(SIGTERM, sig_handler) == SIG_ERR)
    {
        //exit(EXIT_FAILURE);
    }



    start_timer(2000, &timer_callback);

    if (res != 0)
    {
        //exit(EXIT_FAILURE);
    }

    return res;
}

static void timer_callback(void)
{
    printf("timer works!\n");
}

执行程序后,它回显“测试!”。迅速。忽略睡眠或usleep命令。如果我注释掉start_timer行,它会进入睡眠状态,而在定时器之后,它就不会进入睡眠状态。

2 个答案:

答案 0 :(得分:2)

您没有显示用于启动计时器的标准接口。

nanosleep's manpage nanosleep

的交互
usleep

未指定。

#include <unistd.h> int my_usleep(useconds_t Usec); #include <time.h> int my_usleep(useconds_t Usec) { return nanosleep(&(const struct timespec){ .tv_sec = Usec/100000, .tv_nsec=1000*Usec%1000000}, NULL); } 应该没有这个问题。

来自{{3}}:

  

与sleep(3)和usleep(3)相比,nanosleep()具有以下优点   优点:它为指定睡眠提供了更高的分辨率   间隔; POSIX.1明确指定它不与   信号;它使恢复已经睡眠的任务   被信号处理程序中断更容易。

以上建议将您的$Script:NestedLists = @("test",@("test_level_2")) function AddToReference { param ([ref]$RefVar) ($RefVar.value)[1] += , "hi" } addtoreference ([ref]$Script:NestedLists) $Script:NestedLists[1] 替换为:

$a = "first","array"
$b = "second","array"
$script:nested = $null
$script:nested += , $a
$script:nested += , $b

应该解决问题。

答案 1 :(得分:2)

似乎您正在使用类似于https://www.teuniz.net/Timer_code/中可用的计时器库。如果在该库中打开timer.c,则会看到它使用setitimer(ITIMER_REAL, ...)。每当计时器到期时,以此方式创建的计时器将生成SIGALRM。反过来,这会将您的程序从sleep()唤醒。

为什么?因为,如果您阅读了sleep()的POSIX规范(可从http://pubs.opengroup.org/onlinepubs/009695399/->字母索引-> sleep()获得),则会阅读。

  

sleep()函数将导致调用线程被暂停执行,直到由参数seconds指定的实时秒数已过或信号已传递至调用线程动作是调用信号捕捉功能或终止该过程。

另一方面,如果您不是正在使用上述库,则您需要确切显示start_timer()函数的功能。否则,任何试图帮助您的人都会在黑暗中射击。

解决方案:线程

我认为您唯一的选择是使用单独的线程-一个线程用于睡眠的任务,另一个线程用于处理计时器的任务。