• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            Posix Threads 筆記9 -- Threads and Signals

            Posted on 2009-11-17 15:19 Prayer 閱讀(666) 評論(1)  編輯 收藏 引用 所屬分類: LINUX/UNIX/AIX
            #include <signal.h>

            int pthread_sigmask(int how, const sigset_t *restrict set,
            sigset_t *restrict oset);
                                                                                  Returns: 0 if OK, error number on failure

            說明:
            1. 每個線程都有自己獨立的信號屏蔽,但卻共享進程的信號處理。這意味著在一個線程中改變信號處理,會影響到其他線程。
            2. 創建新線程時,新線程繼承主線程的當前信號屏蔽。
            3. 當信號是由于硬件錯誤或者定時器溢出而引起時,信號被發往引起該信號的線程;其他情況下,信號送往進程的隨意一個線程。
            4. pthread_sigmask 是多線程下的信號屏蔽設置函數,參數與 sigprocmask 類似。后者在多線程環境下,行為未定義。



            #include <signal.h>

            int sigwait(const sigset_t *restrict set, int *restrict signop);
                                                                               Returns: 0 if OK, error number on failure

            說明:
            1. 使用 sigwait 等待特定信號前,首先要屏蔽該信號,進入sigwait 后會自動解除阻塞,sigwait 返回前,重新恢復信號屏蔽。
            2. sigwait 提供了異步信號的同步處理方式—— 可以在每個線程中屏蔽信號,而選特定的一個或多個線程去處理信號。在線程的上下文中處理信號,而不在傳統的打斷線程執行的信號句柄。
            3. 當有多個線程都調用 sigwait 等待同一信號時,信號到達時,只有一個線程的 sigwait 會返回。另外當信號句柄與sigwait 同時存在時,信號的處理取決于實現,但兩者只能取其一。
            4. APUEv2 給出的例子如下:

            #include "apue.h"
            #include <pthread.h>

            int quitflag; /* set nonzero by thread */
            sigset_t mask;

            pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
            pthread_cond_t wait = PTHREAD_COND_INITIALIZER;

            void *
            thr_fn(void *arg)
            {
            int err, signo;

            for (;;) {
            err = sigwait(&mask, &signo);
            if (err != 0)
            err_exit(err, "sigwait failed");
            switch (signo) {
            case SIGINT:
            printf("\ninterrupt\n");
            break;

            case SIGQUIT:
            pthread_mutex_lock(&lock);
            quitflag = 1;
            pthread_mutex_unlock(&lock);
            pthread_cond_signal(&wait);
            return(0);

            default:
            printf("unexpected signal %d\n", signo);
            exit(1);
            }
            }
            }
            int
            main(void)
            {
            int err;
            sigset_t oldmask;
            pthread_t tid;

            sigemptyset(&mask);
            sigaddset(&mask, SIGINT);
            sigaddset(&mask, SIGQUIT);
            if ((err = pthread_sigmask(SIG_BLOCK, &mask, &oldmask)) != 0)
            err_exit(err, "SIG_BLOCK error");

            err = pthread_create(&tid, NULL, thr_fn, 0);
            if (err != 0)
            err_exit(err, "can't create thread");

            pthread_mutex_lock(&lock);
            while (quitflag == 0)
            pthread_cond_wait(&wait, &lock);
            pthread_mutex_unlock(&lock);

            /* SIGQUIT has been caught and is now blocked; do whatever */
            quitflag = 0;

            /* reset signal mask which unblocks SIGQUIT */
            if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
            err_sys("SIG_SETMASK error");
            exit(0);
            }



            #include <signal.h>

            int pthread_kill(pthread_t thread, int signo);

                                                                                   Returns: 0 if OK, error number on failure

            說明:
            1. 該函數用來向線程發送信號。
            2. 如果信號默認會終止進程,則向線程發送該信號會終止線程所在的進程。
            3. 定時器(alarm_timer)是進程資源,進程的所有線程共享同一套定時器。所以在線程中同時設置定時器會相互干擾。

            Feedback

            # re: Posix Threads 筆記9 -- Threads and Signals  回復  更多評論   

            2009-11-30 17:44 by seven
            請教下啊
            如果我想寫一個多線程的Ping,每個線程Ping一個IP地址,如果Ping過程中用的是SIGALRM這個信號量來控制每個線程總的sendto()。該如何實現呢?
            如果每個線程都調用SIGALRM的處理函數會不會出現沖突之類的?
            不懂這方面的哎。。。。
            久久久久青草线蕉综合超碰| 久久免费视频网站| 亚洲欧美精品一区久久中文字幕| 伊人久久大香线蕉精品不卡 | 麻豆AV一区二区三区久久| 久久人人爽人人爽人人片AV高清| 久久香蕉国产线看观看精品yw| 国产精品99久久99久久久| 国产精品伦理久久久久久| 国产精品久久久久久久久久影院| 韩国免费A级毛片久久| 日本高清无卡码一区二区久久| 久久婷婷国产综合精品| 亚洲国产天堂久久综合网站| 国内精品伊人久久久久777| 久久天堂电影网| 久久天天躁狠狠躁夜夜不卡 | 一日本道伊人久久综合影| 久久亚洲精精品中文字幕| 久久se这里只有精品| 久久久久免费看成人影片| 亚洲国产高清精品线久久| 日本福利片国产午夜久久| 久久偷看各类wc女厕嘘嘘| 久久久久久久综合综合狠狠| 狠狠色丁香婷婷久久综合不卡 | 一本一本久久A久久综合精品| 国产高潮国产高潮久久久91| 久久久久亚洲精品天堂| 国产精品久久久久蜜芽| 久久天天躁狠狠躁夜夜av浪潮 | 一级女性全黄久久生活片免费 | 国产一区二区三精品久久久无广告| 亚洲精品第一综合99久久| 国内精品欧美久久精品| 99久久国产主播综合精品| 精品国产一区二区三区久久| 久久国产精品77777| 日韩人妻无码精品久久免费一| 精品久久久久久无码不卡| 久久精品综合一区二区三区|