日期:2014-05-16  浏览次数:20654 次

求助,进程池中信号问题
我编写了一个进程池的服务器程序,父进程fork出多个子进程,父进程负责accept客户端发来的请求,然后发送信号到空闲的子进程中,子进程接到信号,进行这个通讯连接的处理动作。
现在的问题是:父进程接收到客户端的请求后,向处于pause()中的子进程发送SIGUSR1信号成功后,子进程仍然不执行下面的处理函数,应该是还在挂起状态中,不知道为何。
子进程:

signal(SIGUSR1, SIG_IGN);
sigfillset(&sigset)
sigdelset(&sigset, SIGUSR1);
sigdelset(&sigset, SIGTERM);
sigprocmask(SIG_BLOCK, &sigset, NULL);

while(1) {
  pause();
  TcpsssThread  //子进程处理函数 总是执行不到这里
  ....
}
对信号了解不深,各位帮帮忙!!!

------解决方案--------------------
SIGUSR1都被你block了,,肯定没法唤醒了... 同时又被你SIG_IGN忽略了,(这种情况没试过会不会唤醒sleep进程,自己试验.)
推荐一个函数, man 3 sigwait ,剩下的自己看吧,

SIGWAIT(3)                 Linux Programmer's Manual                SIGWAIT(3)

NAME
       sigwait - wait for a signal

SYNOPSIS
       #include <signal.h>

        int sigwait(const sigset_t *set, int *sig);

   Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       sigwait(): _POSIX_C_SOURCE >= 1 
------解决方案--------------------
 _XOPEN_SOURCE 
------解决方案--------------------
 _POSIX_SOURCE

DESCRIPTION
       The  sigwait()  function suspends execution of the calling thread until
       the delivery of one of the signals specified in  the  signal  set  set.
       The  function  accepts  the signal (removes it from the pending list of
       signals), and returns the signal number in sig.
------解决方案--------------------
先不说信号,假定子进程可以成功执行。
父进程accept之后,子进程如何处理这个连接??