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

+ Recent posts