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

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>
            午夜精品视频在线观看一区二区| 亚洲国产综合在线| 久久国产精品亚洲77777| 国产乱码精品一区二区三区忘忧草 | 中文av一区二区| 欧美一区二区视频免费观看| 性欧美1819sex性高清| 国产精品亚洲美女av网站| 久久精品欧美日韩| 亚洲理伦电影| 久久偷窥视频| 欧美一区二区三区的| 亚洲激情六月丁香| 99re热精品| 经典三级久久| 国产精品久久久久久久久果冻传媒| 欧美中文字幕第一页| 日韩一级裸体免费视频| 美女精品在线观看| 亚洲一区精品视频| 一区二区三区日韩精品| 亚洲国产精品一区二区第四页av | 久久国产一区| 亚洲视频第一页| 亚洲丰满在线| 久久久久久国产精品mv| 亚洲美女尤物影院| 中文国产亚洲喷潮| 裸体歌舞表演一区二区| 欧美一区二区视频在线| 蜜桃av综合| 国产精品亚洲不卡a| 亚洲国产91精品在线观看| 亚洲一区二区三区在线观看视频| 亚洲免费黄色| 亚洲精品美女在线| 亚洲激情视频在线观看| 亚洲欧美资源在线| 欧美aⅴ一区二区三区视频| 麻豆成人在线观看| 欧美不卡在线视频| 午夜亚洲视频| 久久成人精品| 国产精品蜜臀在线观看| 国产精品一区一区| 亚洲精选视频在线| 欧美成人午夜| 亚洲精品一区二区三区99| 久久精品视频导航| 国产精品理论片| 亚洲天堂激情| 99re6热只有精品免费观看 | 日韩一级片网址| 久久精品导航| 亚洲欧美日韩中文播放| 久久不射中文字幕| 国产精品yjizz| 国产日韩精品一区| 一色屋精品亚洲香蕉网站| 亚洲国产毛片完整版| 久久精品二区亚洲w码| 亚洲色图制服丝袜| 国产精品国产三级欧美二区| 在线视频一区观看| 一区二区精品在线观看| 久久精品99国产精品| 国产免费亚洲高清| 欧美一区二区三区四区高清| 一区二区三区高清在线观看| 欧美日韩国产一级| 国内不卡一区二区三区| 亚洲人成7777| 午夜伦理片一区| 99精品黄色片免费大全| 亚洲欧美日韩国产一区二区三区 | 久久九九免费视频| 亚洲国产色一区| 亚洲精品一区二区三区不| 欧美日韩成人在线观看| 亚洲欧美综合另类中字| 欧美在线免费一级片| 亚洲高清视频一区二区| 亚洲精品一线二线三线无人区| 欧美日韩在线视频首页| 在线播放一区| 欧美激情一区二区久久久| 性做久久久久久| 在线欧美视频| 欧美永久精品| 久久一区激情| 国产一区在线视频| 欧美高清视频一区二区| 欧美日韩免费在线| 日韩午夜激情电影| 亚洲一区二区精品在线观看| 欧美国产视频一区二区| 国产日本欧美一区二区三区| 久久免费国产| 欧美在线电影| 日韩系列欧美系列| 欧美一区二区在线免费观看| 亚洲精品裸体| 久久久久久久激情视频| 亚洲一二三区视频在线观看| 久久久999精品免费| 亚洲视频福利| 免费观看在线综合色| 亚洲国产日本| 亚洲一区二区三区视频| 亚洲破处大片| 欧美呦呦网站| 亚洲尤物视频网| 亚洲国产欧美精品| 久久精品一本久久99精品| 亚洲精品美女久久久久| 欧美一区二区三区四区在线观看地址 | 亚洲精品色婷婷福利天堂| 国产欧美日韩中文字幕在线| 亚洲精品久久久久| 欧美日韩直播| 欧美激情一区二区三区在线视频观看| 国产精品实拍| 亚洲视频在线播放| 国产精品亚洲人在线观看| 欧美激情国产日韩| 在线精品国精品国产尤物884a| 亚洲女人小视频在线观看| 国产欧美精品xxxx另类| 亚洲日本中文字幕| 91久久精品网| 免费欧美日韩国产三级电影| 久久五月激情| 精品动漫3d一区二区三区免费| 午夜电影亚洲| 欧美在线观看网址综合| 国产精品丝袜久久久久久app| 99ri日韩精品视频| 亚洲一级片在线观看| 欧美日韩亚洲一区三区| 亚洲美女av在线播放| 亚洲小说区图片区| 国产精品久久午夜| 亚洲欧美综合国产精品一区| 久久精品成人| 有码中文亚洲精品| 理论片一区二区在线| 亚洲一区二区三区色| 欧美精品久久99久久在免费线| 先锋影音一区二区三区| 欧美特黄一级| 亚洲综合色网站| 欧美在线一二三四区| 欧美大片专区| 欧美一区二区视频在线观看2020| 欧美日韩免费在线视频| 亚洲美女av在线播放| 亚洲欧美制服另类日韩| 国内伊人久久久久久网站视频| 亚洲欧洲精品一区二区三区 | 亚洲国产va精品久久久不卡综合| 久久疯狂做爰流白浆xx| 另类综合日韩欧美亚洲| 亚洲激情黄色| 国产精品成人观看视频免费| 亚洲自拍另类| 嫩草影视亚洲| 亚洲一级电影| 狠狠噜噜久久| 欧美久久久久久久久| 蜜臀av在线播放一区二区三区| 激情五月综合色婷婷一区二区| 蜜臀久久久99精品久久久久久| 亚洲肉体裸体xxxx137| 亚洲综合电影一区二区三区| 国产亚洲精品久| 一本色道久久88精品综合| 亚洲欧美日韩国产一区二区| 欧美国产精品日韩| 亚洲国产专区| 亚洲一区精品电影| 欧美成人影音| 午夜国产精品视频免费体验区| 永久免费精品影视网站| 欧美午夜一区二区福利视频| 久久久久国产精品午夜一区| 亚洲日本成人女熟在线观看| 久久久99久久精品女同性| 国产欧美精品| 欧美激情影音先锋| 久久频这里精品99香蕉| 亚洲午夜一区| 亚洲精品免费在线| 鲁大师影院一区二区三区| 亚洲永久网站| 一本久道久久综合狠狠爱| 欧美日韩国产123| 久久成人免费电影| 亚洲一区自拍| 日韩一级黄色片| 亚洲黄色免费|