先看send:
1. 定义信号量函数
static void sighandler(int signo)
{
sigval tid;
tid.sival_int = signo;
cout << pid <<" " << signo << endl;
sigqueue(pid, SIGWINCH, tid); // 发送给接收端信号量和内容
}
- 注册信号量
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sa.sa_handler = sighandler;
sigaction(SIGSEGV, &sa, NULL);
sigaction(SIGBUS, &sa, NULL);
sigaction(SIGILL, &sa, NULL);
sigaction(SIGABRT, &sa, NULL);
sigaction(SIGFPE, &sa, NULL);
再看recv端
1. 注册SIGWINCH信号量
signal(SIGWINCH, sighandler);
- 设置SIGWINCH信号量阻塞
sigset_t sset;
sigemptyset(&sset);
sigaddset(&sset, SIGWINCH);
sigprocmask(SIG_BLOCK, &sset, NULL);
- 阻塞住信号
const struct timespec timeout = { 5, 0 };
for(;;){
int signo = sigtimedwait(&sset, &info, &timeout);
if(signo==-1 && errno==-EAGAIN)
continue;
if(signo <= 0) {
usleep(100*1000);
continue;
}
int tid = info.si_int;
cout << "recv tid " << tid <<endl;
}