利用WNOHANG的waitpid来处理同时多个child终止,但unix只投递一个SIG_CHLD的情况。

当accept慢速系统调用被EINTR中断后应重启。


void sig_chld(int signo){
   pid_t pid;
   int stat;
   while((pid = waitpid(-1,&stat,WNOHANG)) >0 ){
      printf("child %d process terminated.\n",pid);
   }
   return;
}

int main(void){
   ...
   signal(SIGCHLD,sig_chld);
   while(1)
  {
     if((connfd = accept(listenfd,(struct sockaddr*)&cliaddr,&clilen)) < 0)
     {
         if(errno == EINTR)
             continue;
         else
             printf("accept error! %s",strerror(errno));
             return errno;
      }
      printf("get a connection\n");
      if((handlerpid = fork()) == 0)
      {
          handler(connfd);
          exit(0);
      }
      close(connfd);
  }
  ...
}

回到家很懒的看书,加上半天时间要献给学车,更不行了,趁周末空了赶紧花了几个小时把这本书翻了一遍,感觉获益不少,趁热打铁,记录下来……
先说书中提到的一些基本风格而我经常忽视或者未注意到的十条规则:

1. 头文件.h:只存放“声明”不存放“实现”,并利用ifndef/define/endif结构避免重复引用。

2. 空格的适当运用。二元操作符前后空,参数列表的‘,’后要空。

3. 对于类的定义尽量采用“以行为为中心”的格式,先函数,再数据。

4. i,j,k等一般只作为较小的局部变量名(循环体),而对于作用域较大的变量命名需遵守成个工程的规则并有含义。

5. 注重运算符的优先级,并多用()来划定运算优先级。不要把程序中的复合表达式和数学表达式混淆。

阅读全文…

, ,