`
sealbird
  • 浏览: 584182 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

3、POSIX 线程 – pthread_sigmask

阅读更多
POSIX 线程 – pthread_sigmask 收藏
POSIX 线程 – pthread_sigmask


在多线程的程序里,希望只在主线程中处理信号,可以使用


函数:
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


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fytzzh/archive/2006/04/12/660457.aspx
分享到:
评论

相关推荐

    POSIX多线程程序设计+源码

    - 使用`pthread_sigmask()`可以改变线程的信号掩码,控制线程接收哪些信号。 8. **源码分析** - 在源码中,可以看到如何创建和管理线程,如何使用互斥锁、条件变量等同步机制,以及如何处理线程取消和调度等问题...

    Programming with POSIX Threads 英文版+ 中文版+源码

    《Programming with POSIX Threads》是一本深入探讨多线程编程的经典著作,主要针对使用POSIX线程(也称为pthreads)的开发人员。POSIX线程是UNIX和类UNIX系统中的多线程API,它提供了在单个进程内创建和管理多个...

    posix thread

    POSIX线程,通常简称为pthreads,是操作系统编程中的一个关键概念,特别是在多处理器和多核系统中。它是开放系统互连(OSI)模型的一部分,由IEEE POSIX标准定义,旨在提供跨不同Unix和类Unix系统的一致性线程接口。...

    pthreads-w32-2-9-1-release

    3. **编写代码**:按照POSIX线程API编写多线程程序。 4. **编译与运行**:使用配置好的编译器编译程序,然后在Windows环境下运行。 总结而言,pthreads-w32库为Windows开发者提供了一种在Windows系统上使用POSIX...

    pthreads-w32-2-8-0-release.tar.gz

    为了解决这个问题,开发人员创建了pthreads-w32,它是一个开源项目,旨在为Windows提供与POSIX线程接口兼容的实现。 标题中的“pthreads-w32-2-8-0-release”是该项目的一个特定版本,这表明它是一个针对Windows...

    pthread源代码

    3. **线程同步**:`pthread`库提供了多种同步机制,如互斥锁(`pthread_mutex_t`)、条件变量(`pthread_cond_t`)、读写锁(`pthread_rwlock_t`)等。这些同步机制的实现可以在`pthread`源代码中找到,它们是多线程...

    libpthread.so

    这个库是POSIX线程(也称为pthreads)的实现,对于编写多线程应用程序至关重要。本文将深入探讨libpthread.so库的功能、用途及其在开发中的应用。 首先,libpthread.so是Linux内核提供的一种系统级服务,它实现了...

    cmdqueue:基于C中pthread的高效调度队列

    "cmdqueue:基于C中pthread的高效调度队列"是一个专门用于处理C语言环境下的命令调度的库,它利用POSIX线程(pthread)来实现高效的并发执行。POSIX线程是跨平台的多线程API,广泛应用于Unix-like系统中,如Linux。 ...

    linux环境多线程出错处理的分析[归类].pdf

    通常,可以使用`pthread_sigmask()`来改变线程的信号掩码,这样可以控制哪些线程可以接收特定的信号。 此外,`sigaction()`函数用于设置信号处理函数,可以替代传统的`signal()`函数,因为它允许更精细的控制,如...

    一些很好的Linux 信号讲解

    默认情况下,信号会被发送到进程中的任意线程,但可以使用pthread_sigmask来设置线程的信号掩码,实现线程级别的信号控制。 七、实时信号 除了标准的POSIX信号,Linux还支持实时信号(Realtime Signals),它们提供...

Global site tag (gtag.js) - Google Analytics