3, POSIX 스레드 – pthreadsigmask

POSIX 스레드 – pthreadsigmask 모음집
POSIX 스레드 – pthreadsigmask
다중 스레드 프로그램에서 주 스레드에서만 신호를 처리하고 사용할 수 있기를 희망합니다
함수:
int pthread_sigmask (int how,
const sigset_t *set,
sigset_t *oset)
주 조정 라인에서 신호 마스크를 제어하는 데 쓰인다.
How:
SIG_BLOCK: 결과 집합은 현재 집합 매개 변수 집합의 합집합입니다
SIG_UNBLOCK: 결과 세트는 현재 컬렉션 매개변수 세트의 차 세트입니다.
SIG_SETMASK: 결과 세트는 매개변수 세트가 가리키는 세트입니다.
헤더 파일:
오류: [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
", tid); rc = sleep(30); printf("Thread %u did not get expected results! rc=%d
", tid, rc); return NULL; } void *threadmasked(void *parm) { pthread_t tid = pthread_self(); sigset_t mask; int rc; printf("Masked thread %lu entered
", tid); sigfillset(&mask); /* Mask all allowed signals */ rc = pthread_sigmask(SIG_BLOCK, &mask, NULL); if (rc != 0) { printf("%d, %s
", rc, strerror(rc)); return NULL; } rc = sleep(15); if (rc != 0) { printf("Masked thread %lu did not get expected results! " "rc=%d
", tid, rc); return NULL; } printf("Masked thread %lu completed masked work
", 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
", argv[0]); printf("Set up the alarm handler for the process
"); 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
"); for(i=0; i<NUMTHREADS; ++i) { rc = pthread_create(&threads[i], NULL, threadfunc, NULL); if (rc != 0) { printf("%d, %s
", rc, strerror(rc)); return -1; } rc = pthread_create(&maskedthreads[i], NULL, threadmasked, NULL); if (rc != 0) { printf("%d, %s
", rc, strerror(rc)); return -1; } } sleep(3); printf("Send a signal to masked and unmasked threads
"); 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
"); for(i=0; i<NUMTHREADS; ++i) { rc = pthread_join(threads[i], NULL); rc = pthread_join(maskedthreads[i], NULL); } printf("Main completed
"); return 0; } void sighand(int signo) { pthread_t tid = pthread_self(); printf("Thread %lu in signal handler
", 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

좋은 웹페이지 즐겨찾기