alarm函数(linux c 使用alarm SIGALRM信号发送后直接就退出如何做才能不退出)

linux c 使用alarm SIGALRM信号发送后直接就退出如何做才能不退出

一、 使用时钟和定时器(alarm系统调用)

#include 《unistd.h》

unsigned alarm(unsigned secs);

/*returns secs left on previous alarm or zero if none */

alarm也称为闹钟函数,它可以在进程中设置一个定时器,当指定的时间到时,它向进程发送SIGALRM信号。需要注意的是,一个进程只能有一个定时器。当报警开始时,会发送一个SIGALRM,子进程继承其父进程的报警时钟值,但实际的时钟并不共享。执行exec后,报警时钟仍然保持其设置。

alarm按照secs指定的秒数来设置时钟,如果secs为0,则关闭报警时钟,这样做是很有必要的,如果recvfrom函数读到数据,没到设定时钟值时就返回了,而你又忘记关闭报警时钟的话,那么它将在不久后报警,在计算机看来,1秒都是一个很漫长的时间,1秒后的报警可能会造成本进程中其他函数执行的中断,因为一个进程只有一个定时器,所以使用完定时器后,一定要关闭定时器。

实例代码:

详细代码

在Linux中怎么样编写代码,确定一段时间过去了一个小时

alarm()函数,函数中的参数表示时间,单位为秒。这个函数的执行是,程序运行到这里开始计时,到了你所指定的参数时间后,给当前进程发出SIGALRM信号。然后用signal函数接收信号,转到要执行的函数出执行。这只是简单的一种用法,其他用法自己查资料。
比方说你这个例子:
#include 《unistd.h》
#include 《signal.h》
#include 《stdio.h》
int i=1;
void handler() //自定义的处理函数
{
printf(“5秒时间到!\n“);
i=0; //将全局变量置0,退出main中的while循环
}
main()
{

signal(SIGALRM,handler);//等待接收SIGALRM信号

alarm(5); //5秒计时

while (i) //死循环,抱着进程在5秒之前不能退出
{

}
return 0;
}
程序运行结构为,运行5秒后,打印出5秒时间到!,退出程序。
注意这个程序是linux中的,windows中头文件不匹配

linux alarm 能在线程中用吗

  不管是在进程还是线程,很多时候我们都会使用一些定时器之类的功能,这里就定时器在多线程的使用说一下。首先在linux编程中定时器函数有alarm()和setitimer(),alarm()可以提供一个基于秒的定时功能,而setitimer可以提供一个基于微妙的定时功能。
  alarm()原型:
  #include 《unistd.h》
  unsigned int alarm(unsigned int seconds);
  这个函数在使用上很简单,第一次调用这个函数的时候是设置定时器的初值,下一次调用是重新设置这个值,并会返回上一次定时的剩余时间。
  setitimer()原型:
  #include 《sys/time.h》
  int setitimer(int which, const struct itimerval *value,struct itimerval *ovalue);
  这个函数使用起来稍微有点说法,首先是第一个参数which的值,这个参数设置timer的计时策略,which有三种状态分别是:
  ITIMER_REAL:使用系统时间来计数,时间为0时发出SIGALRM信号,这种定时能够得到一个精准的定时,当然这个定时是相对的,因为到了微秒级别我们的处理器本身就不够精确。
  ITIMER_VIRTUAL:使用进程时间也就是进程分配到的时间片的时间来计数,时间为0是发出SIGVTALRM信号,这种定时显然不够准确,因为系统给进程分配时间片不由我们控制。
  ITIMER_PROF:上面两种情况都能够触发
  第二个参数参数value涉及到两个结构体:
  struct itimerval {
  struct timeval it_interval; /* next value */
  struct timeval it_value; /* current value */
  };
  struct timeval {
  long tv_sec; /* seconds */
  long tv_usec; /* microseconds */
  };
  在结构体itimerval中it_value是定时器当前的值,it_interval是当it_value的为0后重新填充的值。而timeval结构体中的两个变量就简单了一个是秒一个是微秒。
  上面是这两个定时函数的说明,这个函数使用本不是很难,可以说是很简单,但是碰到具体的应用的时候可能就遇到问题了,在多进程编程中使用一般不会碰到什么问题,这里说的这些问题主要体现在多线程编程中。比如下面这个程序:
  #include 《pthread.h》
  #include 《signal.h》
  #include 《stdio.h》
  #include 《stdlib.h》
  #include 《unistd.h》
  #include 《sys/time.h》
  void sig_handler(int signo)
  {
  alarm(2);
  printf(“alarm signal\n“);
  }
  void *pthread_func()
  {
  alarm(2);
  while(1)
  {
  pause();
  }
  }
  int main(int argc, char **argv)
  {
  pthread_t tid;
  int retval;
  signal(SIGALRM, sig_handler);
  if((retval = pthread_create(&tid, NULL, pthread_func, NULL)) 《 0)
  {
  perror(“pthread_create“);
  exit(-1);
  }
  while(1)
  {
  printf(“main thread\n“);
  sleep(10);
  }
  return 0;
  }
  这个程序的理想结果是:
  main thread
  alarm signal
  alarm signal
  alarm signal
  alarm signal
  alarm signal
  main thread
  可事实上并不是这样的,它的结果是:
  main pthread
  alarm signal
  main pthread
  alarm signal
  main pthread
  为什么会出现这种情况呢?是因为发送给工作线程的信号中断的主线程的sleep,并且这个中情况只影响主线程而不会影响到其他的工作线程。我们怎么才能解决这种问题呢,最简单的方法是修改这个程序,修改这个线程主线程使用alarm,工作线程使用sleep。这样就能够达到我们的要求,但是有时候有不能简单的这样操作。所以我们就需要进一步的修改我们的程序。在这里我第一个想到的是使用signal(SIGALRM, SIG_IGN),可是这个是设置整个进程对这个信号的响应方式,经过测试也确实不能完成我期望的功能,那么怎么办呢?有这样一个函数pthread_sigmask,线程中的信号屏蔽,函数的原型及相关函数为:
  #include 《signal.h》
  int pthread_sigmask(int how, const sigset_t *restrict set, sigset_t *restrict oset);
  函数中第一个参数how有三个值SIG_BLOCK、SIG_SETMASK和SIG_UNBLOCK这里我们是用第二个值SIG_SETMASK
  int sigemptyset(sigset_t *set); /*清除信号集合set*/
  int sigaddset(sigset_t *set, int signum); /*添加信号signum到信号集set中*/
  然后我们改造我们的程序为:
  #include 《pthread.h》
  #include 《signal.h》
  #include 《stdio.h》
  #include 《stdlib.h》
  #include 《unistd.h》
  #include 《sys/time.h》
  void sig_handler(int signo)
  {
  alarm(2);
  printf(“alarm signal\n“);
  }
  void *pthread_func()
  {
  alarm(2);
  while(1)
  {
  pause();
  }
  }
  int main(int argc, char **argv)
  {
  pthread_t tid, tid_1;
  int retval;
  signal(SIGALRM, sig_handler);
  if((retval = pthread_create(&tid, NULL, pthread_func, NULL)) 《 0)
  {
  perror(“pthread_create“);
  exit(-1);
  }
  sigset_t sigset;
  sigemptyset(&sigset);
  sigaddset(&sigset, SIGALRM);
  pthread_sigmask(SIG_SETMASK,&sigset,NULL);
  while(1)
  {
  printf(“main pthread\n“);
  sleep(10);
  }
  return 0;
  }
  这个时候我们就能够看到我们想要的结果了。
  这里再附一个setitimer的使用范例:
  #include 《pthread.h》
  #include 《signal.h》
  #include 《stdio.h》
  #include 《stdlib.h》
  #include 《unistd.h》
  #include 《sys/time.h》
  struct itimerval timerval;
  void sig_handler(int signo)
  {
  printf(“alarm signal\n“);
  }
  void *pthread_func()
  {
  setitimer(ITIMER_REAL, &timerval, NULL);
  while(1)
  {
  pause();
  }
  }
  int main(int argc, char **argv)
  {
  pthread_t tid;
  int retval;
  timerval.it_interval.tv_sec = 2;
  timerval.it_interval.tv_usec = 0;
  timerval.it_value.tv_sec = 2;
  timerval.it_value.tv_usec = 0;
  signal(SIGALRM, sig_handler);
  if((retval = pthread_create(&tid, NULL, pthread_func, NULL)) 《 0)
  {
  perror(“pthread_create“);
  exit(-1);
  }
  sigset_t sigset;
  sigemptyset(&sigset);
  sigaddset(&sigset, SIGALRM);
  pthread_sigmask(SIG_SETMASK,&sigset,NULL);
  while(1)
  {
  printf(“main thread\n“);
  sleep(5);
  }
  return 0;
  }

信号的产生者一般有哪些分别在什么情况下

摘要
1、通过键盘按键产生

用户在终端下按下某些键时,终端驱动程序会发送信号给前台进程,例如Ctrl-C产生SININT信号,Ctrl-\产生SIGQUIT信号,Ctrl-Z产生SIGTSTP信号;

2、调用系统函数向进程发信号

硬件异常产生信号,这些条件由硬件检测到并通知内核,然后内核向当前进程发送适当的信号,例如当前进程执行了除以0的指令,CPU的运算单元会产生异常,内核将这个异常解释为SIGFPE信号发送给进程,再比如当前进程访问了非法的内存地址,MMU会产生异常,内核将这个异常解释为SIGSEGV信号发送给进程。

咨询记录 · 回答于2021-10-25

信号的产生者一般有哪些?分别在什么情况下

1、通过键盘按键产生

用户在终端下按下某些键时,终端驱动程序会发送信号给前台进程,例如Ctrl-C产生SININT信号,Ctrl-\产生SIGQUIT信号,Ctrl-Z产生SIGTSTP信号;

2、调用系统函数向进程发信号

硬件异常产生信号,这些条件由硬件检测到并通知内核,然后内核向当前进程发送适当的信号,例如当前进程执行了除以0的指令,CPU的运算单元会产生异常,内核将这个异常解释为SIGFPE信号发送给进程,再比如当前进程访问了非法的内存地址,MMU会产生异常,内核将这个异常解释为SIGSEGV信号发送给进程。

3、由软件条件产生的信号

SIGPIPE是一种由软件产生的信号,在“管道”中已经介绍过了,这次就认识alarm函数,和SIGALRM信号。

C语言中,alarm函数的用法

在你的alarm()的后面加一个pause()这个函数吧,应该可以的
希望回答能给你带来帮助
如果满意,请采纳,如有疑问,可继续追问。

监控中的alarm什么意思

  • ALARM1-4应该是报警输入1-4路的正极 。 GND是公共地,此处可以接入报警设 备,在程序中设置联动录像。 NO 和COM是输出开关量的接口。

  • 485T+ 485T-是接云台或者球机控制线的 接口。 485R+ 485R-是接收485信号的接口,具 体功能要问厂家

  • alarm也称为闹钟函数,它可以在进程中设置一个定时器,当定时器指定的时间到时,它向进程发送SIGALRM信号。如果忽略或者不捕获此信号,则其默认动作是终止调用该alarm函数的进程。

alarm是什么意思

alarm也称为闹钟函数,它可以在进程中设置一个定时器,当定时器指定的时间到时,它向进程发送SIGALRM信号。如果忽略或者不捕获此信号,则其默认动作是终止调用该alarm函数的进程

alarm的Linux C

alarm函数
要注意的是,一个进程只能有一个闹钟时间,如果在调用alarm之前已设置过闹钟时间,则任何以前的闹钟时间都被新值所代替。需要注意的是,经过指定的秒数后,信号由内核产生,由于进程调度的延迟,所以进程得到控制从而能够处理该信号还需要一些时间。
如果有以前为进程登记的尚未超时的闹钟时钟,而且本次调用的seconds值是0,则取消以前的闹钟时钟,其余留值仍作为alarm函数的返回值。

| 本站所有文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。 如果侵犯了你的权益请来信告知我们删除。邮箱:973000716@qq.com