#include <signal.h>
void sigaction(int signo, const struct sigaction *restrict act, struct sigaction *restrict oact);
/* 성공시 0, 실패시 -1 반환*/
act의 type은 sigaction 구조체이다.
struct sigaction{
void (*sa_handler) (int);
sigset_t sa_mask;
int sa_flags;
void (*sa_sigaction) (int signo, siginfo_t *info, void * context);
};
#include <signal.h>
main() {
static struct sigaction act;
void catchint (int);
act.sa_handler = catchint;
sigfillset(&(act.sa_mask));
sigaction(SIGINT, &act, NULL);
printf("Sleep call #1\n);
sleep(1);
printf("Sleep call #2\n);
sleep(1);
printf("Sleep call #3\n);
sleep(1);
printf("Exiting\n");
exit(0);
void catchint(int signo){
printf("\nCatchint: signo=%d\n",signo);
printf("CATCHINT: returning\n\n");
}
}
$ sigex
sleep call #1
<interrupt>
Catchint: signo=2
Catchint: returing
sleep call #2
sleep call #3
Exiting
again:
if((n=read(fd, buf, BUFFFSIZE)) < 0) {
if(errno == EINTR) goto again;
}
}
void handler(int signo, siginfo_t info, void context);
struct siginfo {
int si_signo; //signal 번호
int si_errno;
int si_code;
pid_t si_pid; // signal을 전송한 process ID
uid_t si_uid; // signal을 전송한 real user ID
void *si_addr; // signal을 전송한 Address
int si_status;
long si_band;
};
#include <signal.h>
void sig_handler(int sig, siginfo_t *siginfo, void* param2){
printf("[parent:%d] : RECIEVE a signal from child %d!!\n".getpid(), siginfo->si_pid);
int main(){
pid_t pid;
struct sigaction act;
int i = 0;
memset($act, 0, sizeof(act)); // 메모리 초기화
/* act.sa_handler 안씀 */
act.sa_sigaction = sig_hander;
act.sa_flags = SA_SIGINFO;
sigfillset(&act.sa_mask);
sigaction(SIGUSR1, &act, 0);
i = 0;
while(pid = fork()){
printf("[parent:%d] : CREATE child %d\n\n", getpid(), pid);
if(++i==3) break; //자식을 3번 생성한다.
}
if(pid > 0){
getchar(); //아무키 누르면 부모 종료
} esle {
kill(getppid(), SIGUSR1); //부모에게 SIGURS1 signal 전송
}
}