浅谈linux几种定时函数的使用

2019-10-13 18:19:55刘景俊

20) #define SIGTTIN 21 /* to readers pgrp upon background tty read */

当一个后台进程尝试进行一个读操作时,SIGTTIN信号被发送给该进程。进程将会阻塞直到接收到SIGCONT信号为止。缺省行为是停止进程,直到接收到SIGCONT信号。

21) #define SIGTTOU 22 /* like TTIN if (tp->t_local<OSTOP) */

SIGTTOU信号与SIGTTIN很相似,不同之处在于SIGTTOU信号是由于后台进程尝试对一个设置了TOSTOP属性的tty执行写操作时才会产生。然而,如果tty没有设置这个属性,SIGTTOU就不会被发送。缺省行为是停止进程,直到接收到SIGCONT信号。

22) #define SIGIO 23 /* input/output possible signal */

如果进程在一个文件描述符上有I/O操作的话,SIGIO信号将被发送给这个进程。进程可以通过fcntl调用来设置。缺省行为是丢弃该信号。

23) #define SIGXCPU 24 /* exceeded CPU time limit */

如果一旦进程超出了它可以使用的CPU限制(CPU limit),SIGXCPU信号就被发送给它。这个限制可以使用随后讨论的setrlimit设置。缺省行为是终止进程。

24) #define SIGXFSZ 25 /* exceeded file size limit */

如果一旦进程超出了它可以使用的文件大小限制,SIGXFSZ信号就被发送给它。稍后我们会继续讨论这个信号。缺省行为是终止进程。

25) #define SIGVTALRM 26 /* virtual time alarm */

如果一旦进程超过了它设定的虚拟计时器计数时,SIGVTALRM信号就被发送给它。缺省行为是终止进程。

26) #define SIGPROF 27 /* profiling time alarm */

当设置了计时器时,SIGPROF是另一个将会发送给进程的信号。缺省行为是终止进程。

27) #define SIGWINCH 28 /* window size changes */

当进程调整了终端的行或列时(比如增大你的xterm的尺寸),SIGWINCH信号被发送给该进程。缺省行为是丢弃该信号。

28) #define SIGUSR1 29 /* user defined signal 1 */

29) #define SIGUSR2 30 /* user defined signal 2 */

SIGUSR1和SIGUSR2这两个信号被设计为用户指定。它们可以被设定来完成你的任何需要。换句话说,操作系统没有任何行为与这两个信号关联。缺省行为是终止进程。(译注:按原文的意思翻译出来似乎这两句话有点矛盾。)

5. 例子

5.1. Linux下的Ctrl+C在Windows下的实现一

Linux下通常的做法:

signal(SIGINT, sigfunc); // 设置信号
void sigfunc(int signo)
  {
   ... //处理信号相关的操作
  }

以下是Linux下的Ctrl+C在Windows下的实现

#include <stdio.h>
  #include <windows.h>
  static is_loop = 1;
  // 捕获控制台 Ctrl+C 事件的函数
  BOOL CtrlHandler( DWORD fdwCtrlType )
  {
   switch (fdwCtrlType)
   {
   /* Handle the CTRL-C signal. */
   case CTRL_C_EVENT:
     printf("CTRL_C_EVENT n");
     break;
   case CTRL_CLOSE_EVENT:
     printf("CTRL_CLOSE_EVENT n");
     break;
   case CTRL_BREAK_EVENT:
     printf("CTRL_BREAK_EVENT n");
     break;
   case CTRL_LOGOFF_EVENT:
     printf("CTRL_LOGOFF_EVENT n");
     break;
   case CTRL_SHUTDOWN_EVENT:
     printf("CTRL_SHUTDOWN_EVENT n");
     break;
   default:
     return FALSE;
   }
   is_loop = 0;
   return (TRUE);
  }

  int main(int argc, char *argv[])
  {
   printf("Set Console Ctrl Handlern");
   SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler, TRUE);
   while (is_loop);
   return 0;
  }