| 示例代码: 
[cpp] view plaincopyprint?01.#include <stdio.h>
 02.#include <pthread.h>
 03.#include <unistd.h>
 04.#include <stdlib.h>
 05.#include <signal.h>
 06.
 07.void sig_thread_func(int sig)
 08.{
 09.    printf("sig_thread_func : sig = %dn", sig);
 10.}
 11.void sig_func(int sig)
 12.{
 13.    printf("sig_func : sig = %dn",sig);
 14.}
 15.
 16.void *func1(void *arg)
 17.{
 18.    signal(SIGUSR1, sig_thread_func);   //线程1先运行,设置了signal
 19.
 20.    sigset_t set;
 21.    sigfillset(&set);
 22.    sigdelset(&set, SIGUSR1);
 23.    pthread_sigmask(SIG_SETMASK, &set, NULL);//线程1屏蔽了除了SIGUSR1外的所有信号
 24.
 25.    printf("pthread 1 runn");
 26.    int i;
 27.    for(i = 0; i < 7; ++i)
 28.    {
 29.        printf("1...n");
 30.        sleep(1);
 31.    }
 32.    return 0;
 33.}
 34.void *func2(void *arg)
 35.{
 36.    printf("pthread 2 runn");
 37.    int i;
 38.    for(i = 0; i < 7; ++i)
 39.    {
 40.        printf("2...n");
 41.        sleep(1);
 42.    }
 43.    return 0;
 44.}
 45.
 46.int main()
 47.{
 48.    pthread_t tid1, tid2;
 49.    pthread_create(&tid1, NULL, func1, NULL);
 50.    pthread_create(&tid2, NULL, func2, NULL);
 51.
 52.    sleep(1);
 53.    signal(SIGUSR1, sig_func);  //覆盖了线程1设置的signal
 54.
 55.    //向线程1发送SIGUSR1,SIGUSR2
 56.    sleep(1);
 57.    pthread_kill(tid1, SIGUSR1);//调动handler
 58.    sleep(1);
 59.    pthread_kill(tid1, SIGUSR2);//屏蔽了,无响应
 60.
 61.    //向线程2发送SIGUSR1,SIGUSR2
 62.    sleep(1);
 63.    pthread_kill(tid2, SIGUSR1);//调用handler
 64.    sleep(1);
 65.    //pthread_kill(tid2, SIGUSR2);//会终止进程,是进程!
 66.
 67.    sigset_t set;
 68.    sigfillset(&set);
 69.    sigprocmask(SIG_SETMASK, &set, NULL);//进程屏蔽了所有信号
 70.
 71.    sleep(1);
 72.    kill(getpid(), SIGUSR1);//调动handler?其实是线程1响应的
 73.
 74.    pthread_join(tid1, NULL);
 75.    pthread_join(tid2, NULL);
 76.
 77.    return 0;
 78.}
 查看本栏目更多精彩内容:http://www.bianceng.cn/OS/unix/ (编辑:温州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |