Bionic unistd.h。而且,ualarm()已经过时了。
我在Android NDK上移植一个应用程序,所以我需要等效的 ualarm(999999,999999),即能够定期发送 SIGALRM 的内容(每秒)
也许使用timer_create()?它似乎是implemented in Bionic。但是手册页中的示例实际上并非无足轻重......
代码我将移植到Android(NDK):
/*
* Set a recurring 1 second timer that will call sigalrm() and switch to
* a new channel.
*/
act.sa_handler = sigalrm_handler;
sigaction (SIGALRM, &act, 0);
ualarm(CHANNEL_INTERVAL, CHANNEL_INTERVAL);
change_channel(1);
/* Whenever a SIGALRM is thrown, go to the next 802.11 channel */
void sigalrm_handler(int x)
{
next_channel();
}
答案 0 :(得分:0)
好的,create_timer是关键。太糟糕没人及时回答了一个例子。
我通过简化this answer来构建此代码。
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <time.h>
// Handler that will be called every its.it_value.tv_sec seconds + its.it_value.tv_nsec nanoseconds until you kill the timer
static void handler(int sig, siginfo_t *si, void *uc)
{
printf("Caught signal %d from timer\n", sig);
}
int main(int argc, char *argv[])
{
struct sigevent sev;
struct itimerspec its;
sigset_t mask;
struct sigaction sa;
timer_t timerid;
// Define sigaction: handler
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = handler;
sigemptyset(&sa.sa_mask);
sigaction(SIGUSR1, &sa, NULL);
// Define sigevent
sev.sigev_notify = SIGEV_SIGNAL;
sev.sigev_signo = SIGUSR1;
// Create the timer
timer_create(CLOCK_REALTIME, &sev, &timerid);
its.it_value.tv_sec = 1;
its.it_value.tv_nsec = 0;
its.it_interval.tv_sec = its.it_value.tv_sec;
its.it_interval.tv_nsec = its.it_value.tv_nsec;
timer_settime(timerid, 0, &its, NULL);
// Sleeps (100sec) is aborted: its default behavior is to wake up when a signal is received (1sec)
// So we sleep again to properly see the next signal in this example.
// That's just for the example so that the process doesn't terminate.
sleep(100); sleep(100); sleep(100); sleep(100); sleep(100); sleep(100);
exit(EXIT_SUCCESS);
}
使用ualarm(0,0)禁用定期计时器。没有必要在参数中传递计时器。但是使用time_delete,我们需要这个计时器参考。因此,必须调整代码以记住定时器引用以禁用它。
因此,如果需要,可以通过引用传递计时器:
some_function(..., &timerid);
void some_function(..., timer_t *timerid)
并禁用计时器:
timer_delete(timerid);
另请注意,ualarm使用SIGALRM信号。在这段代码中,我们使用的是SIGUSR1。
SIGALRM,SIGVTALRM和SIGPROF SIGALRM,SIGVTALRM和SIGPROF信号在调用前一个警报设置中指定的时间限制时发送到进程 功能(如setitimer)过去了。 SIGALRM在真实或发送时发送 时钟时间流逝。 SIGVTALRM在使用的CPU时间发送 过程过去了。 SIGPROF是在进程使用的CPU时间和时发送的 由系统代表过程流逝。
SIGUSR1和SIGUSR2 SIGUSR1和SIGUSR2信号被发送到进程以指示用户定义的条件。
如果您使用多个全部使用SIGUSR1的计时器,则可能存在计时器冲突。检查original answer以使用SIGUSR1处理多个计时器。