프로세스의 신호 마스크 [sigprocmask (int what, const sigset t *set, sigset t *oldset)]

3035 단어 linux_signal
예를 들어 SIGHUP의 신호 처리 프로그램이 있는데 someString은 문자열을 가리키는 전역 변수입니다.
void handleHup(int signum)
{
	free(someString);
	someString=strdup("a different string.");
}

프로그램이 문자열을 복사하고 있을 때를 가정합니다.
src=someString;
while(*src) *dest++=*src++;

SIGHUP 신호가 도착하면 src는 방출된 메모리를 가리킨다.
 
그래서 우리는 코드가 신호의 방해를 받지 않도록 하기 위해서 신호 마스크를 사용해야 한다. (어떤 신호가 응답하지 않을 수 있는지 설명하는 것이고, 막힌다고 한다.)
에서 함수:
int sigprocmask(int what,const sigset_t *set,sigset_t *oldset); 신호 마스크는 여기에서 그의 그림자를 볼 수 없고 특정한 물건으로 그를 보존하지 않았다. 어쨌든 두 가지가 있다. 하나는 set이고, 다른 하나는 신호 마스크이다. 그들은sigsett 유형.이렇게 함수sigprocmask(0,NULL,&oldset)를 호출하면현재 신호 마스크는oldset으로 복사됩니다.
what:1)SIG_BLOCK: set의 신호를 현재 신호 마스크에 추가합니다.  2)SIG_UNBLOCK: set의 신호를 현재 신호 마스크에서 제거합니다.  3)SIG_SETMASK: set의 신호를 신호 마스크에 지불합니다.
example:
#include
#include
#include
#include
#include

void checkmask(sigset_t* sigset=NULL);//print sigset    ,  print     

int main()
{
	char buffer[100];
	sigset_t blockset,sigset;
  
	sigemptyset(&blockset);
	sigaddset(&blockset,SIGINT);//blockset=SIGINT、SIGTSTP
	sigaddset(&blockset,SIGTSTP);
  
	sigprocmask(SIG_SETMASK,&blockset,&sigset);//    =blockset,sigset           
 
	puts("first before sigprocmask,the mask:");
	checkmask(&sigset);
  
	puts("first after sigprocmask, the mask: ");
	checkmask();  
  
	printf("-------------------
"); sigaddset(&blockset,SIGTERM); sigprocmask(SIG_BLOCK,&blockset,&sigset);// |=blockset puts("second before sigprocmask,the mask:"); checkmask(&sigset); puts("second after sigprocmask, the mask: "); checkmask(); printf("-------------------
"); sigdelset(&blockset,SIGINT); sigdelset(&blockset,SIGTERM); sigprocmask(SIG_UNBLOCK,&blockset,&sigset);// -=blockset puts("third before sigprocmask,the mask:"); checkmask(&sigset); puts("third after sigprocmask, the mask: "); checkmask(); printf("---------------
finish!!
"); return 0; } void checkmask(sigset_t *s) { sigset_t sigset; if(s==NULL) { if(sigprocmask(0,NULL,&sigset)<0)//get { printf("Sigprocmask error"); return ; } } else sigset=(*s); if(sigismember(&sigset,SIGINT)) printf("SIGINT
"); if(sigismember(&sigset,SIGTSTP)) printf("SIGTSTP
"); if(sigismember(&sigset,SIGTERM)) printf("SIGTERM
"); } //output: /* first before sigprocmask,the mask: first after sigprocmask, the mask: SIGINT SIGTSTP ------------------- second before sigprocmask,the mask: SIGINT SIGTSTP second after sigprocmask, the mask: SIGINT SIGTSTP SIGTERM ------------------- third before sigprocmask,the mask: SIGINT SIGTSTP SIGTERM third after sigprocmask, the mask: SIGINT SIGTERM --------------- finish!! */

 

좋은 웹페이지 즐겨찾기