콘텐츠로 바로가기

now0930 일지

이런저런 생각

  • 홈
  • 비공개
  • 강좌
  • 잔여 작업 조회
  • 위치

signal, page 342

signal 예제. shell에서 kill -l로 해당 PID에 시그널을 보낼 수 있다.

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
/* handler for SIGINT */


static void signal_hanlder (int signo)
{
/*
* Technically, you shouldn't use printf() in a
* signal handler, but it isn't the end of the
* world. I'll discuss why in the section
* "Reentrancy."
*/
	if(signo == SIGINT){
		printf ("Caught SIGINT!\n");
		exit (EXIT_SUCCESS);
	}
	else if(signo == SIGCHLD){
		printf ("SIGCHLD occured!\n");
		//exit (EXIT_SUCCESS);

	}
}

static void sigchld_handler (int signo)
{
/*
* Technically, you shouldn't use printf() in a
* signal handler, but it isn't the end of the
* world. I'll discuss why in the section
* "Reentrancy."
*/
	printf ("SIGCHLD occured!\n");
	//exit (EXIT_SUCCESS);
}

static void sighup_handler (int signo)
{
/*
* Technically, you shouldn't use printf() in a
* signal handler, but it isn't the end of the
* world. I'll discuss why in the section
* "Reentrancy."
*/
	printf ("SIGHUP occured!\n");
	printf ("ignoring SIGHUP\n");
	if (signal(SIGHUP, SIG_IGN) == SIG_ERR){
		fprintf (stderr, "Cannot ignore SIGHUP!\n");
		exit (EXIT_FAILURE);
	}

}


int main (void)
	{
	/*
	* Register signal_hanlder as our signal handler
	* for SIGINT.
	*/
	int pid;

	if (signal (SIGINT, signal_hanlder) == SIG_ERR) {
		fprintf (stderr, "Cannot handle SIGINT!\n");
		exit (EXIT_FAILURE);
	}
	if (signal(SIGCHLD, signal_hanlder) == SIG_ERR){
		fprintf (stderr, "Cannot handle SIGCHLD!\n");
		exit (EXIT_FAILURE);

	}

	//signal hangup 등록
	//주석 처리 후 run.. shell로 signal 전송.
	//pi@raspberrypi:~ $ kill -1 pid
	//하면 
	//pi@raspberrypi:~/Project/cCode/systemProgram $ rm ./a.out ;gcc signal.c ;./a.out
	//I'm child, died
	//SIGCHLD occured!
	//끊어짐
	//주석 처리하면
	//pi@raspberrypi:~ $ kill -1 pid
	//하면 무시함.

	if (signal(SIGHUP, SIG_IGN) == SIG_ERR){
		fprintf (stderr, "Cannot ignore SIGHUP!\n");
		exit (EXIT_FAILURE);
	}


	//더 이어서..
	//한번 sighup을 주면 메세지를 주고,
	//두번째 받으면 무시되도록 작성.
	if (signal(SIGHUP, sighup_handler) == SIG_ERR){
		fprintf (stderr, "Cannot redefine SIGHUP!\n");
		exit (EXIT_FAILURE);
	}

	pid=fork();

	if(pid == 0){
		//child process
		printf("I'm child, died\n");
		sleep(1);
		_exit(EXIT_SUCCESS);
	}

	for (;;)
		pause ();

	return 0;
}

이 글 공유하기:

  • Tweet
발행일 2020-07-09글쓴이 이대원
카테고리 생활코딩 태그 c, linux, system program

댓글 남기기응답 취소

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.

글 탐색

이전 글

anonymous memory mapping, p308

다음 글

Linux System Programming

2026 3월
일 월 화 수 목 금 토
1234567
891011121314
15161718192021
22232425262728
293031  
2월    

최신 글

  • 현대전력전자공학, 5장 2026-02-25
  • 현대전력전자공학, 4장 2026-02-20
  • 현대전력전자공학, 2장 2026-02-20
  • 현대전력전자공학 1장 2026-02-19
  • code assistant 사용 소감 2026-02-19

카테고리

  • 달리기
  • 산업계측제어기술사
  • 삶 자국
    • 책과 영화
    • 투자
  • 생활코딩
    • LEGO
    • ROS
    • tensorflow
  • 전기기사
  • 피아노 악보

메타

  • 로그인
  • 입력 내용 피드
  • 댓글 피드
  • WordPress.org

페이지

  • 소개
  • 잔여 작업 조회
    • 작업 추가
    • 작업의 사진 조회
    • 작업 수정 페이지
  • 사진
    • GPS 입력된 사진
    • 사진 조회
  • 위치
    • 하기 휴가 방문지
    • 해외 출장

태그

android bash c docker driver FSM gps java kernel LEGO linux mysql network program opcua open62541 plc programmers python raspberry reinforcementLearning ros state space system program tensorflow transfer function 경제 달리기 러닝 미국 민수 삼국지 세계사 실기 역사 일본 임베디드 리눅스 전기기사 조선 중국 채윤 코딩 테스트 통계 한국사 한국어

팔로우하세요

  • Facebook
now0930 일지
WordPress로 제작.