티스토리 뷰
728x90
이번 포스팅에서는 지난 포스팅에 이어서 시그널에 대해 알아보겠습니다! sigprocmask를 활용해서 프로그램 출력이 0.000 0.000, 1.000 1.000과 같은 수의 쌍이 되도록 코드를 작성해보겠습니다.
이번 예제에서 여러개의 신호를 다룰 예정입니다. 많은 신호를 다루기 위해서는 신호를 집합으로 표시하는 자료 형식이 필요합니다. 이때 우리는 sigset_t라는 자료형을 사용합니다. sigset_t을 이용해서 신호를 block, unblock, pending할 수 있습니다. 이러한 작업을 하기위해 다양한 함수가 있습니다.
- int sigfillset(sigset_t *set) : set에 리눅스에 있는 모든 시그널이 들어간다. (다루지 못하는 SIGSTOP,SIGKILL은 못들어간다.)
- int sigemptyset(sigset_t *set) : set에 있는 모든 시그널을 제거한다.
- int sigaddset(sigset_t *set,int signum) : set에 signum에 해당하는 signal을 추가한다.
- int sigdelset(sigset_t,int signum) : set에 signum에 해당하는 signal을 제거한다.
- int sigismember(const sigset_t *set, int signum) : signum이 set에 속하면 return 1, 속하지 않으면 return 0, 에러 발생 시 -1 반환
- int sigprocmask(int how,const sigset_t *set,sigset_t oldset);
우리는 위의 함수 중에서 sigprocmask에 대해 더 자세히 알아보겠습니다. sigprocmask는 다음과 같이 쓰입니다.
int sigprocmask(int how, const sigset_t *set, sigset_t oldset);
- int how : 시그널을 어떻게 제어할지
- SIG_BLOCK : 기존에 블록된 signal이 있다면 set의 시그널을 추가
- SIG_UNBLOCK : 기존의 블록된 signal에서 set의 시그널을 제거
- SIG_SETMASK : 기존의 블록된 signal을 전부 제거시키고 새로운 set의 시그널들을 BLOCK
- const sigset_t *set : sigprocmask에서 작업할 sigset_t
- sigset_t oldset : 이전에 블록된 signal이 저장되어있는 sigset_t
6. Sigprocmask() 활용해서 SIGALRM 다루기
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
struct two_double{
double a;
double b;
}data;
sigset_t sigset;
int sig;
static struct two_double zeros={0.0,0.0}, ones={1.0,1.0};
void signal_handler(int signo){
sigprocmask(SIG_BLOCK,&sigset,NULL);
if (sig==0)
{
data=zeros;
sig=1;
}
else{
data=ones;
sig=0;
}
printf("%f, %f \n",data.a,data.b);
alarm(1);
sigprocmask(SIG_BLOCK,&sigset,NULL);
}
int main(void){
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_flags=0;
sa.sa_handler=signal_handler;
sigaction(SIGALRM,&sa,NULL);
if (sigaction(SIGALRM,&sa,NULL)==-1)
{
perror("sigaction");
exit(0);
}
data=zeros;
alarm(1);
while (1)
{
sleep(1);
}
return 0;
}
감사합니다~!
728x90
'👩🏻💻개발공부 > 리눅스' 카테고리의 다른 글
[Ubuntu] Npm, node 업그레이드 하는 법 (깔끔ver) (0) | 2023.07.21 |
---|---|
10. 리눅스 시그널(Signal) 예제로 알아보기 (1/2) 🖋 (0) | 2022.12.12 |
10. 리눅스 시그널(Signal) 개념 알아보기🖋 (2) | 2022.12.12 |
9. 리눅스 프로세스(Process) 예제로 알아보기 🔍(2/2) (0) | 2022.12.12 |
9. 리눅스 프로세스(Process) 예제로 알아보기 🔍(1/2) (0) | 2022.12.11 |
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 스페인
- nodejs
- Signal
- 혼공
- 백엔드 개발
- 개발
- 운영체제
- AWS
- 스페인 교환학생
- 백준
- 해커톤
- 혼공학습단
- googleapis
- 프로젝트
- 개발일지
- 자바스크립트
- MySQL
- 혼공단 SQL
- 교환학생
- 깃 예제
- 혼공단 9기
- C++
- JS
- JavaScript
- Process
- Linux
- SQL
- 혼공단
- 공룡책
- 리눅스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
글 보관함