(原) 信号(中)------信号的API函数

(1)signal函数

       void (*signal(int signo, void (*handler)(int)))(int)

    参数:signo---信号编号

       handler---SIG_IGN忽略该信号,SIG_DFL采用系统默认方式处理信号,自定义的信号处理函数指针。

(2)sigaction函数

      int sigaction(int signO, const struct sigaction *act, struct sigaction *oldact)

    参数:signo---信号编号

        act------要设置的对信号的新处理方式

        oldact---原来对信号的处理方式      

      struct sigaction {
          void (*sa_handler)(int);
          void (*sa_sigaction)(int, siginfo_t *, void *);
          sigset_t sa_mask;
          int sa_flags;
          void (*sa_restorer)(void);
      }

(3)kill函数

      int kill(pid_t pid, int signo)

    参数:

      pid---pid大于零时,pid是信号欲送往的进程的标识

        ---pid等于零时,信号将送往所有与调用kill()的那个进程属同一个使用组的进程

        ---pid等于-1时,信号将送往所有调用进程有权给其发送信号的进程,除了进程1(init)

         ---pid小于-1时,信号将送往以-pid为组标识的进程

      signo---信号编号

    注意:int raise(signo)等价于int kill(getpid(), int signo)

(4)alarm和pause函数

      unsigned int alarm(unsigned int seconds);  //返回0或者以前设置的闹钟时间的余留秒数
        int pause(void);

    注意:(1)使用alarm函数设置计时器,在将来某个指定时间该计时器会超时,产生SIGALRM信号,默认动作时终止调用alarm函数的进程,

          每个进程只能有一个闹钟时钟,如果在调用alarm之前已设置过闹钟时间,则任何以前的闹钟时间都被新值所代替。当在调用

            alarm()前已经设置了一个闹钟,那么我们可以调用alarm(0)来取消此闹钟,并返回剩余时间。 

       (2)puase函数使调用进程挂起直到捕捉到一个信号。只有执行了一个信号处理程序并从其返回时,pause才返回-1,并将errno设置

          为EINTR。

   写个程序练习以上函数,程序如下:      

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <sys/wait.h>
 4 #include <unistd.h>
 5 #include <sys/types.h>
 6 #include <errno.h>
 7 #include <signal.h>
 8 static void sig_kill(int signo)
 9 {
10     printf("Received from kill().\n");
11 }
12 static void sig_alarm(int signo)
13 {
14     printf("Receiver form aralm().\n");
15 }
16 int main()
17 {
18 
19     signal(SIGHUP,sig_kill);
20     signal(SIGALRM,sig_alarm);
21 
22     printf("kill() is called.\n");
23     kill(getpid(),SIGHUP);
24     printf("alarm() is called.\n");
25     alarm(3);
26     printf("pause() is called.\n");
27     pause();
28     printf("raise() is called.\n");
29     raise(SIGHUP);
30     exit(0);
31 }

执行结果:

        

 

posted @ 2016-07-25 18:41  来者可追  阅读(287)  评论(0)    收藏  举报