1 분 소요


Signal

Signal의 비동기적 신호처리

#include <signal.h>
void	(*signal (int sig, void(*func)(int)))(int);
typedef void (*sig_t) (int);
sig_t	signal(int sig,sig_t func);

인터럽트처리를 위한 함수.

sig : 제어하고자하는 signal 고유번호
function :

  1. signal 발생시 호출할 함수
  2. SIG_DFL : 신호에 대한 기존 방식
  3. SIG_IGN : 신호를 무시

return : 함수의 최근값. 기존의 동작방식

sigwait

Signal의 동기적 신호처리

#include <signal.h>
int	sigwait(const sigset_t *restrict set, int *restrict sig);
typedef struct {
	unsigned int _sigbits[4];
}

sigaction

sigaction은 signal을 객체단위로 제어

struct  sigaction {
             union __sigaction_u __sigaction_u;  /* signal handler */
             sigset_t sa_mask;               /* signal mask to apply */
             int     sa_flags;               /* see signal options below */
};

union __sigaction_u {
	void    (*__sa_handler)(int);
	void    (*__sa_sigaction)(int, siginfo_t *, void *);
};

#define sa_handler      __sigaction_u.__sa_handler
#define sa_sigaction    __sigaction_u.__sa_sigaction

int	sigaction(int sig, const struct sigaction *restrict act, struct sigaction *restrict oact);

signal을 set으로 묶어서 관리. 다음과 같은 set관리를 위한 함수가 제공됨.

int sigsuspend(const sigset_t *mask);

signal set 선언.

sigset_t sigset_name;

sigemptyset

int sigemptyset(sigset_t *set);

set의 모든 signal을 삭제.

sigfillset

int sigfillset(sigset_t *set);

set의 모든 signal을 추가.

sigaddset

int sigaddset(sigset_t *set, int signo);

signum에 해당되는 signal을 set에 추가.

sigdelset

int sigdelset(sigset_t *set, int signo);

signum에 해당하는 signal을 set에서 삭제.

sigismember

int sigismember(sigset_t *set, int signum);

해당 set에 signal 유무 확인.

sigpending

int sigpending(sigset_t *set);

signal이 발생했지만 block되어 대기중인 signal을 확인할 수 있다.
그러한 signal이 존재한다면 함수호출시 set에 해당 signal을 저장하고 0을 반환한다.

sigprocmask

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

SIGKILL과 SIGSTOP을 제외한 signal들을 block 가능

< how > ; 3 options
SIG_BLOCK/SIG_UNBLOCK : block할 signal에 set에 저장된 signal을 추가/해제 함.
SIG_SETMASK : set에 저장된 signal들만 block함.
oldset에는 이전의 block된 signal이 저장된다.


kill

int	kill(pid_t pid, int sig);

특정 프로세스 외에 그룹 id가 같은 프로세스들에게 signal을 전송할 수 있다.

pid Description
양수 지정한 pid에 signal 전송
0 같은 그룹에 있는 프로세스들에 signal 전송
-1 권한을 갖고 있는 프로세스들에게 signal 전송
음수 pid의 절댓값에 해당하는 프로세스 그룹에 signal 전송

ex)

#include <stdio.h>
#include <unistd.h>

int main(void)
{
	printf("pid = %d\n", getpid());
	while (1)
	{
    	printf("tehyoyee\n");
		sleep(1);
	}
}
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

int main(int argc, char *argv[])
{
   if (argc < 2)
      printf("./a.out [프로세스 ID]\n");
   else
      kill(atoi(argv[1]), SIGKILL);
}

두번째 실행파일에 pid값을 인자로 넣어주면 첫번째 실행파일을 종료시킬 수 있다.

태그:

카테고리:

업데이트:

댓글남기기