프로젝트를 진행할 때, 운영체제의 신호를 받아 그에 대응하는 행동을 실행하는 코드를 작성하였다.
빌드한 실행파일을 실행하고, ctrl+c
나 kill
명령을 사용하여 프로그램을 종료할 수 있는데,,
ctrl+z
를 눌렀을 때는 stop 이라고 뜨면서,
해당하는 포트로 다른 실행파일을 실행하려면 이미 실행 중인 파일이 있다며 오류가 뜬다..
그리고 내가 중지한 그 프로그램이 재개가 가능하다는 것을 알게 되었다
위 사진은 mqtt 프로젝트의 브로커를 실행하다가, ctrl+c를 눌러 프로그램을 종료한 것이다.
이처럼 foreground에서 동작하는 경우, ctrl+c
는 "프로그램 종료"를 의미한다.
그래서 아래와 같이 채널에 SIGINT 신호가 전달될 시, 서버를 종료하게 만들 수 있다.
sigs := make(chan os.Signal, 1)
done := make(chan bool, 1)
signal.Notify(sigs, syscall.SIGINT)
go func() {
<-sigs
server.Close()
done <- true
}()
background에서 동작하는 경우, kill
명령은 "프로그램 종료"를 의미한다.
일반적인 프로세스는 위 두 신호를 수신하면 시스템에 정의된 기본 종료 절차에 의해 종료된다.
- 특정 신호를 후킹하여 처리하는 핸들러를 등록하기 위해서 C에서는
signal()
함수를 사용한다.
signal.Notify(sigs, syscall.SIGTERM)
ctrl+z
는 "프로세스 정지(stop)"를 의미한다.
ctrl+z를 눌러 프로그램을 정지시키면, 위와 같은 화면을 볼 수 있다.
이 프로그램을 재개하려면, 괄호 안에 있는 숫자를 fg %
뒤에 써주면 된다!
fg % 1
입력fg%1
이라고 입력하면, 리눅스가 못 알아듣는다고 한다.그리고 위에서 foreground와 background 얘기가 많이 나오는데, 얘네는 추후 정리할 예정이다.
간단하게 설명하면,
리눅스에서 Foreground와 Background 프로세스는 터미널과의 연결 여부에 따라 구분된다.
Foreground 프로세스는 사용자와 상호작용하며, Background 프로세스는 사용자와 상호작용하지 않는다.