signal 進程通信

先看send:
1. 定義信號量函數

static void sighandler(int signo)
{
        sigval tid;
        tid.sival_int = signo;
        cout << pid <<" " << signo << endl;
        sigqueue(pid, SIGWINCH, tid); // 發送給接收端信號量和內容
}
  1. 註冊信號量
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);
  1. 設置SIGWINCH信號量阻塞
sigset_t sset;
sigemptyset(&sset);
sigaddset(&sset, SIGWINCH);
sigprocmask(SIG_BLOCK, &sset, NULL);
  1. 阻塞住信號
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;
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章