kill의 pid의 값에 따른 의미
pid>0 프로세스의 식별 번호이다. 해당 프로세스에게만 시그널을 보낸다
pid=0 자신과 같은 그룹에 있는 모든 프로세스에게 시그널을 보낸다.
pid=-1 자신과 같은 그룹에 있는 모든 프로세스에게 시그널을 보낸다.
단, 프로세스 식별 번호가1인 프로세스를 제외한다.
pid<-1 프로세스 그룹 식별 번호가 -pid인 모든 프로세스에게 시그널을 보낸다. pid가 -100이라면
그룹 식별 번호가 100인 모든프로세스를 의미한다.
raise(sig; == kill(getpid(),sig);
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
#include <signal.h>
#include <stdio.h>
void handler(int signum);
int flag=5;
main()
{
struct sigaction act;
sigset_t set;
sigemptyset(&(act.sa_mask));
sigaddset(&(act.sa_mask),SIGALRM);
sigaddset(&(act.sa_mask),SIGINT);
sigaddset(&(act.sa_mask),SIGUSR1);
act.sa_handler=handler;
sigaction(SIGALRM,&act,NULL);
sigaction(SIGINT,&act,NULL);
sigaction(SIGUSR1,&act,NULL);
printf("call raise(SIGUSR1) befoer blocking\n");
raise(SIGUSR1);
sigemptyset(&set);
sigaddset(&set,SIGUSR1);
sigprocmask(SIG_SETMASK,&set,NULL);
while(flag) {
printf("input SIGINT [%d]\n",flag);
sleep(1);
}
printf("call kill(getpid(),SIGUSR1) after blocking\n");
kill(getpid(),SIGUSR1);
printf("sleep by pause.. zzZZ\n");
printf("pause return %d\n",pause());
printf("2 scnods sleeping..zzZ\n");
alarm(2);
pause();
}
void handler(int signum)
{
flag--;
switch(signum){
case SIGINT:
printf("SIGINT(%d)\n",signum);
break;
case SIGALRM:
printf("SIGALRM(%d)\n",signum);
break;
case SIGUSR1:
printf("SIGUSR1(%d)\n",signum);
break;
default:
printf("signal(%d)\n",signum);
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none; color:white">cs |
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
|
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
main()
{
sigset_t set;
int result;
sigemptyset(&set);
result=sigismember(&set,SIGALRM);
printf("SIGALRM is %s a member\n",result ? "":"not");
sigaddset(&set,SIGALRM);
result = sigismember(&set,SIGALRM);
printf("SIGALRM is %s a member\n",result ? "" : "not");
sigfillset(&set);
result = sigismember(&set,SIGCHLD);
printf("SIGCHLD is %s a member\n",result ?"" : "not");
sigdelset(&set,SIGCHLD);
result = sigismember(&set,SIGCHLD);
printf("SIGCHLD is %s a member\n",result ?"":"not");
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none; color:white">cs |
sigpromask
특정 시그널을 선택적으로 블록시키기 위한 함수
#include <signal.h>
int sigprocmask(int how,const sigset_t *set, sigset_t *oldset);
how : sigprocmask 함수의 행동 방식을 결정
set : 새롭게 적용되는 시그널 마스크
oldset : 이전에 적용되어 있는 시그널 마스크를 저장 (백업)
반환값 : 호출이 성공할 경우 0을 반환, 실패하면 -1을 반환
프로세스가 대단히 중요한 코드를 실행 중일 때 작업에 방해를 받지 않기 위해 시그널을 무시할 수 도 있다.
시그널 봉쇄 -> 중요한 작업 수행 -> 시그널 봉쇄 해제
int how
SIG_BLOCK 현재 봉쇄 설정된 시그널의 목록에 두 번째 인자 set에 포함된 시그널을 추가
SIG_UNBLOCK 현재 봉쇄 설정된 시그널의 목록에서 두 번째 인자 set에 포함된 시그널을 제외
SIG_SETMASK 현재 봉쇄 설정된 시그널의 목록을 두 번째 인자 set가 가진 목록으로 대체
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
main()
{
sigset_t set;
int count = 3;
sigemptyset(&set);
sigaddset(&set, SIGINT);
sigprocmask(SIG_BLOCK, &set,NULL);
while(count)
{
printf("don't disturb me (%d) \n",count--);
sleep(1);
}
sigprocmask(SIG_UNBLOCK, &set, NULL);
printf("you did not disturb me!!\n");
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none; color:white">cs |
Signal Block
sigprocmask(): 현재 set 으로 등록 된 시그널의 블럭정책을 변경 하기 위해서 사용 한다.
블럭정책에는 다음의 SIG_BLOCK,SIG_UNBLOCK, SIG_SETMASK가 있다.
블럭 set에 추가 되어있다면, 시그널은 바로 전달되지 않고 handler가 끝날 때 까지 블럭 된다.
sigpending(): 시그널이 블록 된 상태에서 어떤 시그널이 발생해서 블록 되었는지를 알 수 있다.
sigismember() signum이 시그널set에 포함 되어 있는 지 확인한다.
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
31
32
|
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
int main(int argc,char **argv)
{
sigset_t sigset;
sigset_t pendingset;
int i=0;
sigfillset(&sigset); // 모든 시그널 BLOCK
sigprocmask(SIG_BLOCK,&sigset,NULL);
printf("My PID %d\n",getpid());
while(1)
{
printf("%d\n",i);
i++;
sleep(1);
//BLOCK된 시그널이 있따면
if(sigpending(&pendingset)==0)
{
//그리고 BLOCK 된 시그널이 SIGUSR1 이라면 루프를 빠져나감.
if(sigismember(&pendingset,SIGUSR1))
{
printf("BLOCKED Signal : SIGUSR1\n");
break;
}
}
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none; color:white">cs |
'딥러닝 기반 영상인식 개발 전문가 과정 > 리눅스' 카테고리의 다른 글
6월4일 네트워크, Socket (0) | 2019.06.04 |
---|---|
6월 4일 ncurses, pipe, fifo (0) | 2019.06.04 |
6월 4일 오전 실습 (0) | 2019.06.04 |
6월3일 Sigaction, sigset (0) | 2019.06.03 |
6월3일 실습 (0) | 2019.06.03 |