能否通过信号对其它进程里的事件进行计数?--csapp 3.e homework 8.23

#include "../csapp.h"

volatile int counter = 0;

void handler(int sig)
{
        counter++;
        sleep(1);   //do some work in the handler
        return;
}

int main()
{
        int i;
        Signal(SIGUSR2, handler);
        if(Fork() == 0) {
                for(i =  0; i < 10; i++){
                        Kill(getppid(), SIGUSR2);
                        printf("sent SIGUSR2 to parent \n");
                }
                exit(0);
        }
        Wait(NULL);
        printf("counter = %d\n", counter);
        exit(0);
}
$ ./counterprob 
sent SIGUSR2 to parent 
sent SIGUSR2 to parent 
sent SIGUSR2 to parent 
sent SIGUSR2 to parent 
sent SIGUSR2 to parent 
sent SIGUSR2 to parent 
sent SIGUSR2 to parent 
sent SIGUSR2 to parent 
sent SIGUSR2 to parent 
sent SIGUSR2 to parent 
counter = 2

答案似乎是不能的,原因是信号是不排队的,只能同时存在一个pending的信号,一个正在处理,后来的都会被cancel 掉

程序执行图:

 SIGUSR2      SIGUSR2  SIGUSR2  SIGUSR2  SIGUSR2
      |                        |                 |                |               |
being handled   Pending  Canceld  Canceld  Canceld
 need 1 sec

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章