青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Prayer

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

POSIX 線程 – pthread_sigmask

Posted on 2009-11-17 19:56 Prayer 閱讀(6398) 評論(1)  編輯 收藏 引用 所屬分類: LINUX/UNIX/AIX
POSIX 線程 – pthread_sigmask

POSIX 線程 – pthread_sigmask

 


  概念

  • 按照 POSIX, 異步 (外部) 信號發送到整個進程.
  • 所有線程共享同一個設置, 即通過 sigaction 設置的線程處置方法.
  • 每個線程有自己的信號掩碼, 線程庫根據該掩碼決定將信號發送到哪個線程.
  • 由于 Linux 線程實現上的獨特性, 外部信號始終發送到特定的線程.

  pthread_sigmask

  • pthread_sigmask 用來定義線程的信號掩碼
  • 其接口與 sigprocmask 一樣
    ===============================================================================
    #include <pthread.h>
    #include <signal.h>

    int pthread_sigmask (int how, const sigset_t *newmask, sigset_t *oldmask);
    ===============================================================================

  pthread_kill 和 sigwait

===============================================================================
#include <pthread.h>
#include <signal.h>

int pthread_kill (pthread_t thread, int signo);
int sigwait (const sigset_t *set, int *sig);
===============================================================================
  • pthread_kill 向特定的線程發送信號.
  • sigwait 暫定調用線程, 直到 set 中定義的某個信號遞達調用線程.
  • sigwait 返回時, sig 中保存的是接收到的信號編號.
  • sigwait 所等待的信號必須在所有線程中阻塞, 而不僅僅是調用線程. 在多線程的程序里,希望只在主線程中處理信號,可以使用

 

函數:

int pthread_sigmask (int how,

const sigset_t *set,

sigset_t *oset)


     
用作在主調線程里控制信號掩碼。

 

How:

SIG_BLOCK:     結果集是當前集合參數集的并集
SIG_UNBLOCK: 
結果集是當前集合參數集的差集
SIG_SETMASK: 
結果集是由參數集指向的集

 

頭文件: <signal.h>

錯誤:   [EINVAL] how不是已定義值
提示:   除非信號在所有的線程里都阻塞,否則總能將異步信號傳輸給這個進程。

例子:

#include <pthread.h>

#include <stdio.h>

#include <sys/signal.h>

 

#define NUMTHREADS 3

void sighand(int signo);

 

void *threadfunc(void *parm)

{

    pthread_t             tid = pthread_self();

    int                   rc;

 

    printf("Thread %u entered\n", tid);

    rc = sleep(30);

    printf("Thread %u did not get expected results! rc=%d\n", tid, rc);

    return NULL;

}

 

void *threadmasked(void *parm)

{

    pthread_t             tid = pthread_self();

    sigset_t              mask;

    int                   rc;

 

    printf("Masked thread %lu entered\n", tid);

 

    sigfillset(&mask); /* Mask all allowed signals */

    rc = pthread_sigmask(SIG_BLOCK, &mask, NULL);

    if (rc != 0)

    {

        printf("%d, %s\n", rc, strerror(rc));

        return NULL;

    }

 

    rc = sleep(15);

    if (rc != 0)

    {

        printf("Masked thread %lu did not get expected results! "

                       "rc=%d \n", tid, rc);

        return NULL;

    }

    printf("Masked thread %lu completed masked work\n",

                tid);

    return NULL;

}

 

int main(int argc, char **argv)

{

    int                     rc;

    int                     i;

    struct sigaction        actions;

    pthread_t               threads[NUMTHREADS];

    pthread_t               maskedthreads[NUMTHREADS];

 

    printf("Enter Testcase - %s\n", argv[0]);

 

    printf("Set up the alarm handler for the process\n");

    memset(&actions, 0, sizeof(actions));

    sigemptyset(&actions.sa_mask);

    actions.sa_flags = 0;

    actions.sa_handler = sighand;

 

    rc = sigaction(SIGALRM,&actions,NULL);

 

    printf("Create masked and unmasked threads\n");

    for(i=0; i<NUMTHREADS; ++i)

    {

        rc = pthread_create(&threads[i], NULL, threadfunc, NULL);

        if (rc != 0)

        {

            printf("%d, %s\n", rc, strerror(rc));

            return -1;

        }

 

        rc = pthread_create(&maskedthreads[i], NULL, threadmasked, NULL);

        if (rc != 0)

        {

            printf("%d, %s\n", rc, strerror(rc));

            return -1;

        }

    }

 

    sleep(3);

    printf("Send a signal to masked and unmasked threads\n");

    for(i=0; i<NUMTHREADS; ++i)

    {

        rc = pthread_kill(threads[i], SIGALRM);

 

        rc = pthread_kill(maskedthreads[i], SIGALRM);

    }

 

    printf("Wait for masked and unmasked threads to complete\n");

    for(i=0; i<NUMTHREADS; ++i) {

        rc = pthread_join(threads[i], NULL);

 

        rc = pthread_join(maskedthreads[i], NULL);

    }

    printf("Main completed\n");

    return 0;

}

 

void sighand(int signo)

{

    pthread_t             tid = pthread_self();

 

    printf("Thread %lu in signal handler\n",

                             tid);

    return;

}

程序返回:

Enter Testcase - ./pthread_sigmask_test

Set up the alarm handler for the process

Create masked and unmasked threads

Thread 3086597040 entered

Masked thread 3076107184 entered

Thread 3065617328 entered

Masked thread 3055127472 entered

Thread 3044637616 entered

Masked thread 3034147760 entered

Send a signal to masked and unmasked threads

Wait for masked and unmasked threads to complete

Thread 3086597040 in signal handler

Thread 3086597040 did not get expected results! rc=27

Thread 3065617328 in signal handler

Thread 3065617328 did not get expected results! rc=27

Thread 3044637616 in signal handler

Thread 3044637616 did not get expected results! rc=27

Masked thread 3076107184 completed masked work

Masked thread 3055127472 completed masked work

Masked thread 3034147760 completed masked work

Main completed

Feedback

# re: POSIX 線程 – pthread_sigmask   回復  更多評論   

2010-03-27 12:43 by yswzing
可能有 race,pthread_kill 的時候 masked 線程可能還沒有執行 pthread_sigmask 調用
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美一区二区三区视频在线观看| 欧美日韩日本国产亚洲在线| 欧美成人国产va精品日本一级| 午夜在线精品偷拍| 亚洲少妇在线| 亚洲综合欧美日韩| 亚洲欧美日韩国产一区| 亚洲欧美久久久久一区二区三区| 亚洲字幕一区二区| 久久xxxx| 欧美国产一区二区| 99re8这里有精品热视频免费 | 国产精品videosex极品| 欧美日韩成人综合在线一区二区| 欧美午夜宅男影院| 国产欧亚日韩视频| 亚洲国产aⅴ天堂久久| 91久久嫩草影院一区二区| 99av国产精品欲麻豆| 欧美一区高清| 亚洲高清电影| 一本大道av伊人久久综合| 欧美一区亚洲二区| 欧美激情精品久久久久| 欧美sm视频| 欧美日韩精品欧美日韩精品 | 暖暖成人免费视频| 国产精品www994| 加勒比av一区二区| 亚洲一区二区三区精品在线| 欧美在线观看视频一区二区| 亚洲欧美国产高清va在线播| 亚洲图色在线| 久久精品综合一区| 欧美日本精品一区二区三区| 国产日产欧美精品| 夜夜嗨av一区二区三区网页| 久久久国产精品一区| 亚洲精品乱码视频| 久久久久国内| 国产精品视频网| 亚洲精品欧美日韩| 久久婷婷国产麻豆91天堂| 99精品视频一区二区三区| 久久免费视频在线| 国产欧美日韩三区| 亚洲一区二区三区在线观看视频 | 久热精品视频| 国产精品色网| 亚洲午夜精品| 亚洲日本一区二区| 欧美成人精品1314www| 一区国产精品| 久久久久免费视频| 亚洲欧美日韩一区二区三区在线观看| 欧美二区不卡| 亚洲黄色在线| 亚洲二区免费| 麻豆国产精品一区二区三区| 国产综合色产在线精品| 久久精品国产在热久久| 午夜在线精品| 国产伦精品一区二区三区免费 | 日韩亚洲综合在线| 亚洲黄色成人久久久| 免费久久99精品国产| 一区二区亚洲| 牛牛影视久久网| 久久全球大尺度高清视频| 韩日午夜在线资源一区二区| 久久久久久伊人| 久久精品中文字幕一区| 亚洲自拍高清| 亚洲日本免费| 欧美日韩亚洲一区二区三区四区 | 欧美一区二区三区免费大片| 亚洲视频在线观看网站| 国产精品美女一区二区在线观看| 亚洲午夜在线观看| 亚洲一区在线免费观看| 国产免费一区二区三区香蕉精| 欧美一二三区在线观看| 久久精品久久综合| 最新中文字幕一区二区三区| 亚洲精品免费观看| 国产欧美日韩视频在线观看 | 久久在线视频在线| 免费av成人在线| 亚洲伊人色欲综合网| 亚洲欧美激情一区二区| 伊人成综合网伊人222| 亚洲国产精品久久人人爱蜜臀| 欧美日韩中文字幕日韩欧美| 久久免费视频在线| 欧美精品不卡| 久久精品色图| 欧美区一区二| 久久久久久**毛片大全| 欧美国产日韩精品| 欧美一区永久视频免费观看| 美国成人毛片| 午夜在线精品| 欧美激情视频给我| 久久成人人人人精品欧| 欧美激情按摩在线| 亚洲欧美中文字幕| 欧美v亚洲v综合ⅴ国产v| 欧美综合国产| 欧美理论在线播放| 久久久爽爽爽美女图片| 欧美日韩亚洲一区二| 欧美福利影院| 国产人妖伪娘一区91| 亚洲精品久久久蜜桃| 激情久久五月| 性色av一区二区三区| 亚洲视频一区在线观看| 老司机久久99久久精品播放免费| 午夜欧美精品久久久久久久| 欧美激情综合亚洲一二区| 久久久天天操| 国产精品一区二区三区观看| 久久激情久久| 亚洲另类一区二区| 亚洲综合欧美| 一本久久综合亚洲鲁鲁| 久久av一区二区三区漫画| 欧美激情视频一区二区三区免费| 欧美大片一区二区| 老牛嫩草一区二区三区日本| 国产精品swag| 日韩亚洲欧美成人| 亚洲欧洲日本mm| 久久午夜视频| 老司机午夜精品视频| 国产亚洲一区二区三区| 性欧美精品高清| 久久精品2019中文字幕| 国产伦精品一区二区三区免费 | 国产亚洲综合在线| 亚洲欧美三级在线| 欧美亚洲专区| 国产情人节一区| 亚洲欧美中文另类| 欧美一级大片在线观看| 国产日韩欧美亚洲一区| 性欧美暴力猛交69hd| 久久精品水蜜桃av综合天堂| 国产美女精品一区二区三区| 欧美亚洲一区二区在线观看| 久久久精彩视频| 在线精品国产欧美| 免费在线看一区| 亚洲免费观看| 性色一区二区| 在线观看国产精品网站| 麻豆av一区二区三区久久| 亚洲欧洲视频在线| 亚洲一区二区三区四区视频| 国产精品久久久久久久久搜平片| 亚洲一区二区四区| 久久国内精品视频| 影音先锋亚洲视频| 欧美精品一区二区视频| 日韩视频永久免费观看| 欧美一区二区三区视频| 一区二区在线观看av| 欧美精品在线视频| 亚洲尤物在线视频观看| 久久久夜夜夜| 亚洲国内自拍| 国产精品二区在线| 久久久久久久波多野高潮日日| 亚洲第一在线综合在线| 午夜精品亚洲| 亚洲国产福利在线| 国产精品v日韩精品v欧美精品网站| 久久福利电影| 99天天综合性| 女女同性精品视频| 亚洲中字在线| 亚洲韩国一区二区三区| 国产精品素人视频| 久热精品在线| 香蕉久久一区二区不卡无毒影院| 欧美大片一区二区| 性色av一区二区三区在线观看| 亚洲欧洲日韩在线| 国产午夜精品在线| 欧美日韩黄色大片| 美女视频网站黄色亚洲| 亚洲欧美资源在线| 9l国产精品久久久久麻豆| 免费在线看一区| 欧美一区二区三区四区高清| 一本色道久久99精品综合| 1024欧美极品| 久久国产精品免费一区| 在线精品国产成人综合| 国产美女高潮久久白浆|