我又看了看select的程序,原来select处理中是不能有信号的.
select.c的代码:
for (;;) {
set_current_state(TASK_INTERRUPTIBLE);
for (i = 0 ; i < n; i++) {
unsigned long bit = BIT(i);
unsigned long mask;
struct file *file;
switch (n){
case -1:
writelog("!Select Error");
return(-1);
......
这些和SIGALRM的处理都是在守护进程之内执行的。打开socket之后就进入主循环读取数据,收到一条完整的消息(STX开头,ETX结尾)之后就进行处理,处理的过程主要是字符串的处理和数据库的操作然后向socket写回复消息,其中没有调用到select,处理完之后进入下一次循环调用select读数据。
主循环的代码:
for(;;){
ret=waitCtrlChar(fd);
switch(ret){
case -1:
return(-1);
case 0: //link Break or haven't data to transmit
......
break;
case STX: //start record
......
break;
}
}
其中waitCtrlChar调用了select。