๐Ÿšฆ ์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ์™€ ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ ์ž‘์„ฑ: C ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ˆจ์€ ์˜์›…๋“ค ๐Ÿฆธโ€โ™‚๏ธ

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿšฆ ์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ์™€ ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ ์ž‘์„ฑ: C ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ˆจ์€ ์˜์›…๋“ค ๐Ÿฆธโ€โ™‚๏ธ

 

 

์•ˆ๋…•, ์นœ๊ตฌ๋“ค! ์˜ค๋Š˜์€ C ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ˆจ์€ ์˜์›…๋“ค์ธ ์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ์™€ ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ์— ๋Œ€ํ•ด ์žฌ๋ฏธ์žˆ๊ฒŒ ์–˜๊ธฐํ•ด๋ณผ ๊ฑฐ์•ผ. ์ด ์ฃผ์ œ๊ฐ€ ์ข€ ์–ด๋ ต๊ฒŒ ๋“ค๋ฆด ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ, ๊ฑฑ์ • ๋งˆ! ๋‚ด๊ฐ€ ์‰ฝ๊ณ  ์žฌ๋ฏธ์žˆ๊ฒŒ ์„ค๋ช…ํ•ด์ค„ ํ…Œ๋‹ˆ๊นŒ. ๐Ÿ˜‰

์šฐ๋ฆฌ๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ๋•Œ, ๊ทธ ํ”„๋กœ๊ทธ๋žจ์ด ์™ธ๋ถ€ ์„ธ๊ณ„์™€ ์†Œํ†ตํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฐ”๋กœ ์‹œ๊ทธ๋„์ด์•ผ. ๋งˆ์น˜ ์šฐ๋ฆฌ๊ฐ€ ์นœ๊ตฌ๋“ค๊ณผ ๋Œ€ํ™”ํ•  ๋•Œ ์†์ง“์ด๋‚˜ ํ‘œ์ •์œผ๋กœ ์˜์‚ฌ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ํ”„๋กœ๊ทธ๋žจ๋„ ์‹œ๊ทธ๋„์„ ํ†ตํ•ด ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ์šด์˜์ฒด์ œ์™€ ์†Œํ†ตํ•˜์ง€. ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉ์ž๋“ค์ด ์„œ๋กœ ์žฌ๋Šฅ์„ ๊ณต์œ ํ•˜๋“ฏ์ด, ํ”„๋กœ๊ทธ๋žจ๋“ค๋„ ์‹œ๊ทธ๋„์„ ํ†ตํ•ด ์ •๋ณด๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฑฐ์•ผ. ๐Ÿค

๐Ÿ”‘ ํ•ต์‹ฌ ํฌ์ธํŠธ: ์‹œ๊ทธ๋„์€ ํ”„๋กœ๊ทธ๋žจ์—๊ฒŒ ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Œ์„ ์•Œ๋ฆฌ๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์ธํ„ฐ๋ŸฝํŠธ์•ผ. ๊ทธ๋ฆฌ๊ณ  ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ๋Š” ์ด๋Ÿฌํ•œ ์‹œ๊ทธ๋„์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜์ง€.

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์‹œ๊ทธ๋„์˜ ์„ธ๊ณ„๋กœ ๋“ค์–ด๊ฐ€๋ณผ๊นŒ? ์ค€๋น„๋์–ด? ๊ทธ๋Ÿผ ์ถœ๋ฐœ! ๐Ÿš€

๐ŸŽญ ์‹œ๊ทธ๋„: ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฌด์–ธ์˜ ๋Œ€ํ™”

์‹œ๊ทธ๋„์ด ๋ญ”์ง€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž. ์‹œ๊ทธ๋„์€ ํ”„๋กœ๊ทธ๋žจ์—๊ฒŒ "์•ผ, ์ด๊ฒƒ ์ข€ ๋ด!"๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋„ˆ๊ฐ€ ์žฌ๋Šฅ๋„ท์—์„œ ์ƒˆ๋กœ์šด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•˜์„ ๋•Œ ์•Œ๋ฆผ์ด ์˜ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ํ”„๋กœ๊ทธ๋žจ๋„ ์ค‘์š”ํ•œ ์ผ์ด ์ƒ๊ธฐ๋ฉด ์‹œ๊ทธ๋„์„ ๋ฐ›์•„. ๐Ÿ˜ฒ

C ์–ธ์–ด์—์„œ ์‹œ๊ทธ๋„์€ <signal.h> ํ—ค๋” ํŒŒ์ผ์— ์ •์˜๋˜์–ด ์žˆ์–ด. ์ด ํ—ค๋” ํŒŒ์ผ์€ ์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ์— ํ•„์š”ํ•œ ๋ชจ๋“  ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ๋งˆ๋ฒ• ์ƒ์ž ๊ฐ™์€ ๊ฑฐ์•ผ. ๐Ÿงฐ

์‹œ๊ทธ๋„์˜ ์ข…๋ฅ˜๋Š” ์ •๋ง ๋‹ค์–‘ํ•ด. ๋ช‡ ๊ฐ€์ง€ ๋Œ€ํ‘œ์ ์ธ ์‹œ๊ทธ๋„์„ ์†Œ๊ฐœํ•ด์ค„๊ฒŒ:

  • SIGINT (Signal Interrupt): Ctrl+C๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ ๋ฐœ์ƒํ•ด. "์•ผ, ๊ทธ๋งŒํ•ด!"๋ผ๊ณ  ์†Œ๋ฆฌ์น˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด.
  • SIGTERM (Signal Terminate): ํ”„๋กœ๊ทธ๋žจ์„ ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒํ•˜๋ผ๋Š” ์š”์ฒญ์ด์•ผ. "์ด์ œ ๊ทธ๋งŒ ํ•˜๊ณ  ์ง‘์— ๊ฐ€์ž~"๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฑฐ์ง€.
  • SIGSEGV (Signal Segmentation Violation): ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ์œ„๋ฐ˜์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋‚˜ํƒ€๋‚˜. "์•ผ, ๋‚จ์˜ ์ง‘์— ํ•จ๋ถ€๋กœ ๋“ค์–ด๊ฐ€๋ฉด ์–ด๋–กํ•ด!"๋ผ๊ณ  ๊พธ์ค‘ํ•˜๋Š” ๊ฑฐ์•ผ.
  • SIGALRM (Signal Alarm): ์•Œ๋žŒ ์‹œ๊ณ„๊ฐ€ ์šธ๋ฆฌ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์„ค์ •ํ•œ ์‹œ๊ฐ„์ด ์ง€๋‚ฌ์Œ์„ ์•Œ๋ ค์ค˜.

์ด๋Ÿฐ ์‹œ๊ทธ๋„๋“ค์€ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์–ธ์ œ๋“ ์ง€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์–ธ์ œ๋“  ์ƒˆ๋กœ์šด ์žฌ๋Šฅ ๊ฑฐ๋ž˜ ์š”์ฒญ์ด ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฐ ์‹œ๊ทธ๋„๋“ค์„ ์ž˜ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ค€๋น„ํ•ด์•ผ ํ•ด. ๐Ÿ› ๏ธ

๐Ÿ’ก ์žฌ๋ฏธ์žˆ๋Š” ์‚ฌ์‹ค: UNIX ์‹œ์Šคํ…œ์—์„œ๋Š” ์ด 31๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์‹œ๊ทธ๋„์ด ์žˆ์–ด. ๋งˆ์น˜ 31๊ฐ€์ง€ ๋ง›์˜ ์•„์ด์Šคํฌ๋ฆผ์ฒ˜๋Ÿผ ๋‹ค์–‘ํ•˜์ง€! ๐Ÿฆ

์ž, ์ด์ œ ์‹œ๊ทธ๋„์ด ๋ญ”์ง€ ์•Œ์•˜์œผ๋‹ˆ๊นŒ, ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฃจ๋Š”์ง€ ์•Œ์•„๋ณผ ์ฐจ๋ก€์•ผ. ๊ทธ๊ฒŒ ๋ฐ”๋กœ ๋‹ค์Œ์— ์„ค๋ช…ํ•  ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ๋ž€ ๊ฑฐ์•ผ. ์ค€๋น„๋์–ด? ๊ณ„์† ๊ฐ€๋ณด์ž! ๐Ÿƒโ€โ™‚๏ธ

๐Ÿฆธโ€โ™‚๏ธ ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ: ํ”„๋กœ๊ทธ๋žจ์˜ ์Šˆํผํžˆ์–ด๋กœ

์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ๋Š” ๋ญ˜๊นŒ? ๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด, ์‹œ๊ทธ๋„์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๊ทธ๊ฑธ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜์•ผ. ๋งˆ์น˜ ์Šˆํผํžˆ์–ด๋กœ๊ฐ€ ์œ„ํ—˜ ์‹ ํ˜ธ๋ฅผ ๋ฐ›๊ณ  ์ถœ๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ๋„ ์‹œ๊ทธ๋„์„ ๋ฐ›์œผ๋ฉด ๋ฐ”๋กœ ์ผ์„ ์‹œ์ž‘ํ•ด. ๐Ÿฆธโ€โ™€๏ธ

์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฑด ์ƒ๊ฐ๋ณด๋‹ค ์‰ฌ์›Œ. ๊ธฐ๋ณธ ํ˜•ํƒœ๋Š” ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ์–ด:


void signal_handler(int signum) {
    // ์—ฌ๊ธฐ์— ์‹œ๊ทธ๋„์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด
}
  

์—ฌ๊ธฐ์„œ signum์€ ์–ด๋–ค ์‹œ๊ทธ๋„์ด ๋ฐœ์ƒํ–ˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆซ์ž์•ผ. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๊ฐ ์žฌ๋Šฅ๋งˆ๋‹ค ๊ณ ์œ  ๋ฒˆํ˜ธ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์‹œ๊ทธ๋„๋„ ๊ฐ์ž์˜ ๋ฒˆํ˜ธ๊ฐ€ ์žˆ๋Š” ๊ฑฐ์ง€. ๐Ÿ˜Š

์ด์ œ ์ด ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‹œ๊ทธ๋„๊ณผ ์—ฐ๊ฒฐํ•ด์ค˜์•ผ ํ•ด. ๊ทธ๋Ÿด ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๋ฐ”๋กœ signal() ํ•จ์ˆ˜์•ผ. ์‚ฌ์šฉ๋ฒ•์€ ์ด๋ž˜:


signal(SIGINT, signal_handler);
  

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด SIGINT ์‹œ๊ทธ๋„(remember? Ctrl+C)์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  signal_handler ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋ผ. ์ฟจํ•˜์ง€ ์•Š์•„? ๐Ÿ˜Ž

๐Ÿ”‘ ํ•ต์‹ฌ ํฌ์ธํŠธ: ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•˜๋ฉด, ํ”„๋กœ๊ทธ๋žจ์€ ํŠน์ • ์‹œ๊ทธ๋„์— ๋Œ€ํ•ด ๊ธฐ๋ณธ ๋™์ž‘ ๋Œ€์‹  ์šฐ๋ฆฌ๊ฐ€ ์ •์˜ํ•œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•ด. ์ด๊ฑธ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘์„ ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด.

์ž, ์ด์ œ ์‹œ๊ทธ๋„๊ณผ ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ์˜ ๊ธฐ๋ณธ์„ ์•Œ์•˜์œผ๋‹ˆ, ์ข€ ๋” ๊นŠ์ด ๋“ค์–ด๊ฐ€๋ณผ๊นŒ? ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์‹ค์ œ๋กœ ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ์ค€๋น„๋์ง€? Let's go! ๐Ÿš€

โœ๏ธ ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ ์ž‘์„ฑํ•˜๊ธฐ: ์‹ค์ „ ๊ฐ€์ด๋“œ

์ž, ์ด์ œ ์ง„์งœ ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ž‘์„ฑํ•ด๋ณผ ๊ฑฐ์•ผ. ๊ฑฑ์ • ๋งˆ, ์–ด๋ ต์ง€ ์•Š์•„. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ƒˆ๋กœ์šด ์žฌ๋Šฅ์„ ๋“ฑ๋กํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์‰ฝ๊ณ  ์žฌ๋ฏธ์žˆ์„ ๊ฑฐ์•ผ! ๐Ÿ˜„

๋จผ์ €, ๊ฐ„๋‹จํ•œ ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž. ์ด ํ•ธ๋“ค๋Ÿฌ๋Š” SIGINT ์‹œ๊ทธ๋„(Ctrl+C)์„ ๋ฐ›์œผ๋ฉด ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•  ๊ฑฐ์•ผ.


#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void sigint_handler(int signum) {
    printf("\n์žก์•˜๋‹ค! SIGINT ์‹œ๊ทธ๋„! ๐Ÿ˜Ž\n");
    printf("ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ์•ˆ๋…•ํžˆ ๊ฐ€์„ธ์š”! ๐Ÿ‘‹\n");
    exit(signum);
}

int main() {
    // SIGINT ์‹œ๊ทธ๋„์— ๋Œ€ํ•œ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ๋ก
    signal(SIGINT, sigint_handler);

    printf("์ด ํ”„๋กœ๊ทธ๋žจ์€ ๋ฌดํ•œ ๋ฃจํ”„ ์ค‘์ž…๋‹ˆ๋‹ค. Ctrl+C๋ฅผ ๋ˆŒ๋Ÿฌ๋ณด์„ธ์š”!\n");
    while(1) {
        // ๋ฌดํ•œ ๋ฃจํ”„
    }

    return 0;
}
  

์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, ํ”„๋กœ๊ทธ๋žจ์€ ๋ฌดํ•œ ๋ฃจํ”„์— ๋น ์ง€์ง€๋งŒ Ctrl+C๋ฅผ ๋ˆ„๋ฅด๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์ •์˜ํ•œ ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋ผ. ๋ฉ‹์ง€์ง€ ์•Š์•„? ๐ŸŒŸ

๐Ÿ’ก ํ”„๋กœ ํŒ: ์‹ค์ œ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ๋ฌดํ•œ ๋ฃจํ”„ ๋Œ€์‹  ์˜๋ฏธ ์žˆ๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฒ ์ง€๋งŒ, ์ด ์˜ˆ์ œ์—์„œ๋Š” ์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ๋ฅผ ๋ช…ํ™•ํžˆ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ๊ฐ„๋‹จํ•œ ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ–ˆ์–ด.

์ด์ œ ์ข€ ๋” ๋ณต์žกํ•œ ์˜ˆ์ œ๋ฅผ ๋ณผ๊นŒ? ์—ฌ๋Ÿฌ ์‹œ๊ทธ๋„์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด๋ณด์ž. ์ด ํ”„๋กœ๊ทธ๋žจ์€ SIGINT, SIGTERM, ๊ทธ๋ฆฌ๊ณ  SIGALRM์„ ์ฒ˜๋ฆฌํ•  ๊ฑฐ์•ผ.


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

void signal_handler(int signum) {
    switch(signum) {
        case SIGINT:
            printf("\n๐Ÿšจ SIGINT ๋ฐ›์•˜์–ด์š”! ํ•˜์ง€๋งŒ ๋ฌด์‹œํ•  ๊ฑฐ์˜ˆ์š”. ๐Ÿ˜\n");
            break;
        case SIGTERM:
            printf("\n๐Ÿ›‘ SIGTERM ๋ฐ›์•˜์–ด์š”! ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ• ๊ฒŒ์š”. ์•ˆ๋…•ํžˆ! ๐Ÿ‘‹\n");
            exit(signum);
        case SIGALRM:
            printf("\nโฐ ์•Œ๋žŒ์ด ์šธ๋ ธ์–ด์š”! ์ผ์–ด๋‚˜์„ธ์š”! ๐ŸŒž\n");
            break;
    }
}

int main() {
    signal(SIGINT, signal_handler);
    signal(SIGTERM, signal_handler);
    signal(SIGALRM, signal_handler);

    printf("์—ฌ๋Ÿฌ ์‹œ๊ทธ๋„์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด์—์š”!\n");
    printf("Ctrl+C๋ฅผ ๋ˆŒ๋Ÿฌ๋ณด์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  5์ดˆ ๊ธฐ๋‹ค๋ ค๋ณด์„ธ์š”.\n");

    // 5์ดˆ ํ›„์— SIGALRM ๋ฐœ์ƒ
    alarm(5);

    while(1) {
        sleep(1);
        printf(".");
        fflush(stdout);
    }

    return 0;
}
  

์ด ํ”„๋กœ๊ทธ๋žจ์€ ์ •๋ง ์žฌ๋ฏธ์žˆ์–ด! Ctrl+C๋ฅผ ๋ˆŒ๋Ÿฌ๋„ ์ข…๋ฃŒ๋˜์ง€ ์•Š๊ณ , 5์ดˆ๋งˆ๋‹ค ์•Œ๋žŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•ด. SIGTERM ์‹œ๊ทธ๋„(๋ณดํ†ต kill ๋ช…๋ น์–ด๋กœ ๋ณด๋ƒ„)์„ ๋ฐ›์œผ๋ฉด ๊ทธ๋•Œ์„œ์•ผ ์ข…๋ฃŒ๋ผ. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์š”์ฒญ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€ ์•Š์•„? ๐Ÿ˜Š

๐ŸŽ“ ํ•™์Šต ํฌ์ธํŠธ: ์ด ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” ์—ฌ๋Ÿฌ ์‹œ๊ทธ๋„์„ ํ•˜๋‚˜์˜ ํ•ธ๋“ค๋Ÿฌ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•, alarm() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ํƒ€์ด๋จธ ์„ค์ •, ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ๊ทธ๋žจ์˜ ๊ธฐ๋ณธ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ์–ด.

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ ์ž‘์„ฑ์˜ ๊ธฐ๋ณธ์„ ๋ฐฐ์› ์–ด. ํ•˜์ง€๋งŒ ์ด๊ฒŒ ๋‹ค๊ฐ€ ์•„๋‹ˆ์•ผ! ์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ์—๋Š” ๋” ๋งŽ์€ ์žฌ๋ฏธ์žˆ๋Š” ์ฃผ์ œ๋“ค์ด ์žˆ์–ด. ๋‹ค์Œ ์„น์…˜์—์„œ ๊ณ„์†ํ•ด์„œ ์•Œ์•„๋ณด์ž๊ณ ! ๐Ÿš€

๐Ÿง  ์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ์˜ ๊ณ ๊ธ‰ ์ฃผ์ œ๋“ค

์ž, ์ด์ œ ์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ์˜ ๋” ๊นŠ์€ ๋ถ€๋ถ„์œผ๋กœ ๋“ค์–ด๊ฐ€๋ณผ ๊ฑฐ์•ผ. ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ๋Š” ์กฐ๊ธˆ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฑฑ์ • ๋งˆ! ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๊ณ ๊ธ‰ ์žฌ๋Šฅ์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์ฒœ์ฒœํžˆ ํ•˜๋‚˜์”ฉ ์•Œ์•„๊ฐ€๋ณด์ž. ๐Ÿ˜Š

1. sigaction() ํ•จ์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐ

sigaction() ํ•จ์ˆ˜๋Š” signal() ํ•จ์ˆ˜๋ณด๋‹ค ๋” ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•ด. ์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์ง€. ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋ณผ๊นŒ?


#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>

void sigint_handler(int signum) {
    printf("\n๐ŸŽญ SIGINT๋ฅผ sigaction()์œผ๋กœ ์ฒ˜๋ฆฌํ–ˆ์–ด์š”!\n");
}

int main() {
    struct sigaction sa;
    memset(&sa, 0, sizeof(sa));
    sa.sa_handler = sigint_handler;
    
    if (sigaction(SIGINT, &sa, NULL) == -1) {
        perror("sigaction");
        exit(1);
    }

    printf("sigaction()์œผ๋กœ SIGINT ์ฒ˜๋ฆฌ ์ค‘. Ctrl+C๋ฅผ ๋ˆŒ๋Ÿฌ๋ณด์„ธ์š”!\n");
    while(1) {
        // ๋ฌดํ•œ ๋ฃจํ”„
    }

    return 0;
}
  

์ด ์ฝ”๋“œ์—์„œ struct sigaction์„ ์‚ฌ์šฉํ•ด ์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ์„ค์ •ํ•˜๊ณ  ์žˆ์–ด. ์ด ๊ตฌ์กฐ์ฒด๋ฅผ ํ†ตํ•ด ์‹œ๊ทธ๋„ ๋งˆ์Šคํ‚น, ํ”Œ๋ž˜๊ทธ ์„ค์ • ๋“ฑ ๋” ๋งŽ์€ ์˜ต์…˜์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์ง€.

๐Ÿ”‘ ํ•ต์‹ฌ ํฌ์ธํŠธ: sigaction()์€ signal()๋ณด๋‹ค ์ด์‹์„ฑ์ด ์ข‹๊ณ , ์žฌ์ง„์ž… ๊ฐ€๋Šฅํ•œ(reentrant) ์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด. ์‹ค์ œ ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์—์„œ๋Š” sigaction()์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„.

2. ์‹œ๊ทธ๋„ ๋งˆ์Šคํ‚น

์‹œ๊ทธ๋„ ๋งˆ์Šคํ‚น์€ ํŠน์ • ์‹œ๊ทธ๋„์˜ ์ „๋‹ฌ์„ ์ผ์‹œ์ ์œผ๋กœ ๋ง‰๋Š” ๊ธฐ๋Šฅ์ด์•ผ. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ํŠน์ • ์œ ํ˜•์˜ ์•Œ๋ฆผ์„ ์ž ์‹œ ๋„๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด. ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”์ง€ ๋ณผ๊นŒ?


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

void sigint_handler(int signum) {
    printf("\n๐ŸŽญ SIGINT ๋ฐ›์•˜์–ด์š”! ํ•˜์ง€๋งŒ SIGTERM์€ ๋งˆ์Šคํ‚น ์ค‘์ด์—์š”.\n");
}

int main() {
    struct sigaction sa;
    sigset_t mask;

    // SIGINT ํ•ธ๋“ค๋Ÿฌ ์„ค์ •
    sa.sa_handler = sigint_handler;
    sigemptyset(&sa.sa_mask);
    sigaction(SIGINT, &sa, NULL);

    // SIGTERM ๋งˆ์Šคํ‚น
    sigemptyset(&mask);
    sigaddset(&mask, SIGTERM);
    sigprocmask(SIG_BLOCK, &mask, NULL);

    printf("SIGTERM์€ ๋งˆ์Šคํ‚น ์ค‘. Ctrl+C๋ฅผ ๋ˆŒ๋Ÿฌ๋ณด์„ธ์š”!\n");
    while(1) {
        sleep(1);
    }

    return 0;
}
  

์ด ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” SIGTERM ์‹œ๊ทธ๋„์„ ๋งˆ์Šคํ‚นํ•˜๊ณ  ์žˆ์–ด. ๊ทธ๋ž˜์„œ SIGTERM ์‹œ๊ทธ๋„์€ ํ”„๋กœ๊ทธ๋žจ์— ์ „๋‹ฌ๋˜์ง€ ์•Š์•„. ํ•˜์ง€๋งŒ SIGINT๋Š” ์—ฌ์ „ํžˆ ์ฒ˜๋ฆฌ๋ผ. ์žฌ๋ฏธ์žˆ์ง€? ๐Ÿ˜„

3. ๋น„๋™๊ธฐ ์‹œ๊ทธ๋„ ์•ˆ์ „ ํ•จ์ˆ˜

์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ ๋‚ด์—์„œ๋Š” ๋น„๋™๊ธฐ ์‹œ๊ทธ๋„ ์•ˆ์ „ ํ•จ์ˆ˜๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ด. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ๋™์ž‘์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ฑฐ๋“ . ์•ˆ์ „ํ•œ ํ•จ์ˆ˜๋“ค์˜ ๋ชฉ๋ก์€ man signal-safety ๋ช…๋ น์–ด๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด.

์˜ˆ๋ฅผ ๋“ค์–ด, printf()๋Š” ๋น„๋™๊ธฐ ์‹œ๊ทธ๋„ ์•ˆ์ „ํ•˜์ง€ ์•Š์•„. ๋Œ€์‹  write()๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€:


void safe_sigint_handler(int signum) {
    const char msg[] = "์•ˆ์ „ํ•˜๊ฒŒ SIGINT๋ฅผ ์ฒ˜๋ฆฌํ–ˆ์–ด์š”!\n";
    write(STDOUT_FILENO, msg, sizeof(msg) - 1);
}
  

โš ๏ธ ์ฃผ์˜: ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ์—์„œ ๋น„๋™๊ธฐ ์‹œ๊ทธ๋„ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๋ฐ๋“œ๋ฝ์ด๋‚˜ ๋ฐ์ดํ„ฐ ์†์ƒ ๊ฐ™์€ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด. ํ•ญ์ƒ ์ฃผ์˜ํ•ด์•ผ ํ•ด!

4. volatile ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ

์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ์™€ ๋ฉ”์ธ ํ”„๋กœ๊ทธ๋žจ ์‚ฌ์ด์—์„œ ๊ณต์œ ๋˜๋Š” ๋ณ€์ˆ˜๋Š” volatile ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์„ ์–ธํ•ด์•ผ ํ•ด. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์ตœ์ ํ™”ํ•˜์ง€ ์•Š๊ณ , ํ•ญ์ƒ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ง์ ‘ ์ฝ๋„๋ก ํ•ด.


volatile sig_atomic_t signal_received = 0;

void sigint_handler(int signum) {
    signal_received = 1;
}

int main() {
    signal(SIGINT, sigint_handler);

    while (!signal_received) {
        // ์ž‘์—… ์ˆ˜ํ–‰
    }

    printf("์‹œ๊ทธ๋„์„ ๋ฐ›์•„์„œ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.\n");
    return 0;
}
  

์—ฌ๊ธฐ์„œ sig_atomic_t ํƒ€์ž…์€ ์›์ž์ ์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ •์ˆ˜ ํƒ€์ž…์ด์•ผ. ์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜์ง€.

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ์˜ ๊ณ ๊ธ‰ ์ฃผ์ œ๋“ค์„ ์‚ดํŽด๋ดค์–ด. ์ด ๋‚ด์šฉ๋“ค์€ ์‹ค์ œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‹œ๊ทธ๋„์„ ์•ˆ์ „ํ•˜๊ณ  ํšจ๊ณผ์ ์œผ๋กœ ๋‹ค๋ฃจ๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋  ๊ฑฐ์•ผ. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๊ณ ๊ธ‰ ์žฌ๋Šฅ์„ ์ตํžˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์ด๋Ÿฐ ๊ธฐ์ˆ ๋“ค์„ ์ตํžˆ๋ฉด ๋„ˆ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹ค๋ ฅ์ด ํ•œ์ธต ๋” ์—…๊ทธ๋ ˆ์ด๋“œ ๋  ๊ฑฐ์•ผ! ๐Ÿš€

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์‹ค์ œ ์ƒํ™ฉ์—์„œ ์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๋Š”์ง€ ๋ช‡ ๊ฐ€์ง€ ์žฌ๋ฏธ์žˆ๋Š” ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ์ค€๋น„๋์ง€? Let's go! ๐Ÿ˜Ž

๐ŸŽจ ์‹ค์ „ ์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ: ์žฌ๋ฏธ์žˆ๋Š” ์˜ˆ์ œ๋“ค

์ž, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ ๊ธฐ์ˆ ์„ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ช‡ ๊ฐ€์ง€ ์žฌ๋ฏธ์žˆ๋Š” ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋ฐฐ์šด ์žฌ๋Šฅ์„ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ! ๐Ÿ˜„

1. ์šฐ์•„ํ•œ ์ข…๋ฃŒ ๊ตฌํ˜„ํ•˜๊ธฐ

ํ”„๋กœ๊ทธ๋žจ์ด ๊ฐ‘์ž๊ธฐ ์ข…๋ฃŒ๋˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์†์‹ค๋  ์ˆ˜ ์žˆ์–ด. ์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ๋ฅผ ์ด์šฉํ•ด ํ”„๋กœ๊ทธ๋žจ์„ ์šฐ์•„ํ•˜๊ฒŒ ์ข…๋ฃŒํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž.


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

volatile sig_atomic_t keep_running = 1;

void cleanup() {
    printf("๐Ÿงน ์ฒญ์†Œ ์ค‘... ํŒŒ์ผ ์ €์žฅํ•˜๊ณ  ์—ฐ๊ฒฐ ๋‹ซ๋Š” ์ค‘...\n");
    sleep(2);  // ์‹ค์ œ๋กœ๋Š” ์—ฌ๊ธฐ์„œ ์ •๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰
    printf("์ฒญ์†Œ ์™„๋ฃŒ! ์•ˆ๋…•ํžˆ ๊ฐ€์„ธ์š”~ ๐Ÿ‘‹\n");
}

void signal_handler(int signum) {
    printf("\n๐Ÿ›‘ ์‹œ๊ทธ๋„ %d ๋ฐ›์•˜์–ด์š”. ์šฐ์•„ํ•˜๊ฒŒ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.\n", signum);
    keep_running = 0;
}

int main() {
    struct sigaction sa;
    sa.sa_handler = signal_handler;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;

    if (sigaction(SIGINT, &sa, NULL) == -1) {
        perror("sigaction");
        exit(1);
    }

    if (sigaction(SIGTERM, &sa, NULL) == -1) {
        perror("sigaction");
        exit(1);
    }

    printf("ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘... Ctrl+C๋ฅผ ๋ˆŒ๋Ÿฌ ์ข…๋ฃŒํ•ด๋ณด์„ธ์š”.\n");

    while (keep_running) {
        printf("์ž‘์—… ์ˆ˜ํ–‰ ์ค‘... ๐Ÿ’ผ\n");
        sleep(1);
    }

    cleanup();

    return 0;
}
  

์ด ํ”„๋กœ๊ทธ๋žจ์€ SIGINT๋‚˜ SIGTERM ์‹œ๊ทธ๋„์„ ๋ฐ›์œผ๋ฉด ๋ฐ”๋กœ ์ข…๋ฃŒํ•˜์ง€ ์•Š๊ณ , ์ •๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ํ›„ ์ข…๋ฃŒํ•ด. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๊ฑฐ๋ž˜๋ฅผ ๋งˆ๋ฌด๋ฆฌ ์ง€์„ ๋•Œ ๋ชจ๋“  ๊ฒƒ์„ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ. ๐Ÿ‘Œ

๐Ÿ’ก ํ”„๋กœ ํŒ: ์‹ค์ œ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” cleanup() ํ•จ์ˆ˜์—์„œ ์—ด๋ฆฐ ํŒŒ์ผ์„ ๋‹ซ๊ณ , ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์„ ์ •๋ฆฌํ•˜๊ณ , ์ž„์‹œ ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ด.

2. ํƒ€์ด๋จธ ๊ตฌํ˜„ํ•˜๊ธฐ

SIGALRM์„ ์ด์šฉํ•ด ๊ฐ„๋‹จํ•œ ํƒ€์ด๋จธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž. ์ด๊ฑด ์žฌ๋Šฅ๋„ท์—์„œ ์‹œ๊ฐ„ ์ œํ•œ์ด ์žˆ๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ ์œ ์šฉํ•  ๊ฑฐ์•ผ!


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

volatile sig_atomic_t timer_expired = 0;

void timer_handler(int signum) {
    timer_expired = 1;
}

int main() {
    struct sigaction sa;
    sa.sa_handler = timer_handler;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;

    if (sigaction(SIGALRM, &sa, NULL) == -1) {
        perror("sigaction");
        exit(1);
    }

    printf("5์ดˆ ํƒ€์ด๋จธ ์‹œ์ž‘! โฐ\n");
    alarm(5);  // 5์ดˆ ํ›„์— SIGALRM ๋ฐœ์ƒ

      while (!timer_expired) {
        printf("ํƒ€์ด๋จธ ์ง„ํ–‰ ์ค‘... โณ\n");
        sleep(1);
    }

    printf("์‹œ๊ฐ„ ์ข…๋ฃŒ! ๐Ÿ””\n");

    return 0;
}
  

์ด ํ”„๋กœ๊ทธ๋žจ์€ 5์ดˆ ํƒ€์ด๋จธ๋ฅผ ๊ตฌํ˜„ํ•ด. SIGALRM์„ ์ด์šฉํ•ด์„œ ์ •ํ™•ํžˆ 5์ดˆ ํ›„์— ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์ง€. ์žฌ๋Šฅ๋„ท์—์„œ ์‹œ๊ฐ„ ์ œํ•œ ์žˆ๋Š” ํ€ด์ฆˆ๋‚˜ ๊ฒฝ๋งค ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค ๋•Œ ์ด๋Ÿฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด. ๐Ÿ‘

3. ์ž์‹ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌํ•˜๊ธฐ

SIGCHLD ์‹œ๊ทธ๋„์„ ์ด์šฉํ•ด ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์ž.


#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h>

void sigchld_handler(int signum) {
    int status;
    pid_t pid;

    while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
        if (WIFEXITED(status)) {
            printf("์ž์‹ ํ”„๋กœ์„ธ์Šค %d๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ข…๋ฃŒ ์ฝ”๋“œ: %d ๐Ÿ‘ถโžก๏ธ๐Ÿ‘‹\n", 
                   pid, WEXITSTATUS(status));
        } else if (WIFSIGNALED(status)) {
            printf("์ž์‹ ํ”„๋กœ์„ธ์Šค %d๊ฐ€ ์‹œ๊ทธ๋„ %d์— ์˜ํ•ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜ข\n", 
                   pid, WTERMSIG(status));
        }
    }
}

int main() {
    struct sigaction sa;
    sa.sa_handler = sigchld_handler;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = SA_RESTART | SA_NOCLDSTOP;

    if (sigaction(SIGCHLD, &sa, NULL) == -1) {
        perror("sigaction");
        exit(1);
    }

    for (int i = 0; i < 3; i++) {
        pid_t pid = fork();

        if (pid == 0) {  // ์ž์‹ ํ”„๋กœ์„ธ์Šค
            printf("์ž์‹ ํ”„๋กœ์„ธ์Šค %d ์‹œ์ž‘! ๐Ÿ‘ถ\n", getpid());
            sleep(i + 1);
            exit(i);
        } else if (pid < 0) {
            perror("fork");
            exit(1);
        }
    }

    for (int i = 0; i < 5; i++) {
        printf("๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค ์ž‘์—… ์ค‘... ๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ\n");
        sleep(1);
    }

    return 0;
}
  

์ด ํ”„๋กœ๊ทธ๋žจ์€ ์„ธ ๊ฐœ์˜ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ค๊ณ , ๊ฐ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๋งˆ๋‹ค SIGCHLD ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๋ณด๊ณ ํ•ด. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ๊ด€๋ฆฌํ•˜๊ณ  ๊ฐ ์ž‘์—…์˜ ์™„๋ฃŒ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด. ๐Ÿ˜Š

๐Ÿ”‘ ํ•ต์‹ฌ ํฌ์ธํŠธ: SIGCHLD ํ•ธ๋“ค๋Ÿฌ์—์„œ waitpid()๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” WNOHANG ์˜ต์…˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ด. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ธ”๋ก๋  ์ˆ˜ ์žˆ์–ด.

4. ์‹œ๊ทธ๋„์„ ์ด์šฉํ•œ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ 

๋งˆ์ง€๋ง‰์œผ๋กœ, ์‚ฌ์šฉ์ž ์ •์˜ ์‹œ๊ทธ๋„์„ ์ด์šฉํ•ด ๋‘ ํ”„๋กœ์„ธ์Šค ๊ฐ„์— ๊ฐ„๋‹จํ•œ ํ†ต์‹ ์„ ๊ตฌํ˜„ํ•ด๋ณด์ž.


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

#define SIGUSR1 10
#define SIGUSR2 12

void signal_handler(int signum) {
    if (signum == SIGUSR1)
        printf("ํ”„๋กœ์„ธ์Šค %d: PING ๋ฐ›์•˜์–ด์š”! ๐Ÿ“\n", getpid());
    else if (signum == SIGUSR2)
        printf("ํ”„๋กœ์„ธ์Šค %d: PONG ๋ฐ›์•˜์–ด์š”! ๐Ÿ“\n", getpid());
}

int main() {
    pid_t pid = fork();

    if (pid < 0) {
        perror("fork");
        exit(1);
    }

    signal(SIGUSR1, signal_handler);
    signal(SIGUSR2, signal_handler);

    if (pid == 0) {  // ์ž์‹ ํ”„๋กœ์„ธ์Šค
        while(1) {
            sleep(1);
            kill(getppid(), SIGUSR1);  // ๋ถ€๋ชจ์—๊ฒŒ PING
            pause();  // PONG ๊ธฐ๋‹ค๋ฆฌ๊ธฐ
        }
    } else {  // ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค
        while(1) {
            pause();  // PING ๊ธฐ๋‹ค๋ฆฌ๊ธฐ
            sleep(1);
            kill(pid, SIGUSR2);  // ์ž์‹์—๊ฒŒ PONG
        }
    }

    return 0;
}
  

์ด ํ”„๋กœ๊ทธ๋žจ์€ ๋ถ€๋ชจ์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ SIGUSR1๊ณผ SIGUSR2 ์‹œ๊ทธ๋„์„ ์ด์šฉํ•ด "ํ•‘ํ"์„ ์ฃผ๊ณ ๋ฐ›์•„. ์žฌ๋Šฅ๋„ท์—์„œ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…์ด๋‚˜ ์•Œ๋ฆผ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•  ๋•Œ ์ด๋Ÿฐ ๋ฐฉ์‹์˜ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด. ๐Ÿ“

๐Ÿ’ก ์žฌ๋ฏธ์žˆ๋Š” ์‚ฌ์‹ค: SIGUSR1๊ณผ SIGUSR2๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ž์œ ๋กญ๊ฒŒ ์šฉ๋„๋ฅผ ์ •์˜ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ทธ๋„์ด์•ผ. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ!

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ์˜ ์‹ค์ „ ์˜ˆ์ œ๋“ค์„ ์‚ดํŽด๋ดค์–ด. ์ด๋Ÿฐ ๊ธฐ์ˆ ๋“ค์„ ํ™œ์šฉํ•˜๋ฉด ๋” ๊ฐ•๋ ฅํ•˜๊ณ  ์•ˆ์ •์ ์ธ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ์กฐํ•ฉํ•ด ๋ฉ‹์ง„ ํ”„๋กœ์ ํŠธ๋ฅผ ์™„์„ฑํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ. ๐Ÿ˜Š

์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ๋Š” ์ •๋ง ์žฌ๋ฏธ์žˆ๊ณ  ์œ ์šฉํ•œ ์ฃผ์ œ์•ผ. ์ด๊ฑธ ๋งˆ์Šคํ„ฐํ•˜๋ฉด ๋„ˆ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹ค๋ ฅ์ด ํ•œ์ธต ๋” ์—…๊ทธ๋ ˆ์ด๋“œ๋  ๊ฑฐ์•ผ. ๊ณ„์†ํ•ด์„œ ์—ฐ์Šตํ•˜๊ณ  ์‹คํ—˜ํ•ด๋ณด๋Š” ๊ฑธ ์ถ”์ฒœํ•ด! ๐Ÿš€

๐ŸŽ“ ๋งˆ๋ฌด๋ฆฌ: ์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ์˜ ์„ธ๊ณ„

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ์™€ ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ ์ž‘์„ฑ์— ๋Œ€ํ•ด ๊นŠ์ด ์žˆ๊ฒŒ ์•Œ์•„๋ดค์–ด. ์ •๋ง ๊ธด ์—ฌ์ •์ด์—ˆ์ง€๋งŒ, ์ด์ œ ๋„ˆ๋Š” ์‹œ๊ทธ๋„์˜ ์„ธ๊ณ„๋ฅผ ํƒํ—˜ํ•  ์ค€๋น„๊ฐ€ ๋์–ด! ๐ŸŒŸ

์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ๋‚ด์šฉ์„ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋ณผ๊นŒ?

  • ์‹œ๊ทธ๋„์€ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ ์˜ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๊ฐ•๋ ฅํ•œ ๋ฐฉ๋ฒ•์ด์•ผ.
  • ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด.
  • signal() ํ•จ์ˆ˜๋ณด๋‹ค sigaction() ํ•จ์ˆ˜๊ฐ€ ๋” ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•ด.
  • ์‹œ๊ทธ๋„ ๋งˆ์Šคํ‚น์„ ํ†ตํ•ด ์ค‘์š”ํ•œ ์ž‘์—… ์ค‘ ๋ฐฉํ•ด๋ฐ›์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ์–ด.
  • ๋น„๋™๊ธฐ ์‹œ๊ทธ๋„ ์•ˆ์ „ ํ•จ์ˆ˜ ์‚ฌ์šฉ์ด ์ค‘์š”ํ•ด.
  • volatile๊ณผ sig_atomic_t๋ฅผ ์ด์šฉํ•ด ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ€์ˆ˜๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์–ด.
  • ์‹œ๊ทธ๋„์„ ์ด์šฉํ•ด ํƒ€์ด๋จธ, ์ž์‹ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ, ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹  ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด.

์ด ๋ชจ๋“  ๊ฐœ๋…๋“ค์€ ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์˜ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ๋“ค์ฒ˜๋Ÿผ, ๊ฐ์ž ๋…ํŠนํ•˜๊ณ  ์œ ์šฉํ•œ ์—ญํ• ์„ ํ•ด. ์ด๋“ค์„ ์ž˜ ์กฐํ•ฉํ•˜๋ฉด ์ •๋ง ๋ฉ‹์ง„ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด! ๐Ÿ˜Š

๐Ÿ’ก ์•ž์œผ๋กœ์˜ ๋„์ „: ์ด์ œ ๊ธฐ๋ณธ์„ ๋ฐฐ์› ์œผ๋‹ˆ, ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋‚˜์•„๊ฐ€๋ณด๋Š” ๊ฑด ์–ด๋•Œ? ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ํ™˜๊ฒฝ์—์„œ์˜ ์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ, ์‹ค์‹œ๊ฐ„ ์‹œ๊ทธ๋„ ์‚ฌ์šฉ, ๋˜๋Š” ๋‹ค๋ฅธ IPC ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ์‹œ๊ทธ๋„์„ ๊ฒฐํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ• ๋“ฑ์„ ๊ณต๋ถ€ํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฑฐ์•ผ.

์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ๋Š” ์ฒ˜์Œ์—๋Š” ์–ด๋ ค์›Œ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ณ„์† ์—ฐ์Šตํ•˜๊ณ  ์‹คํ—˜ํ•ด๋ณด๋ฉด ์ ์  ๋” ์ž์—ฐ์Šค๋Ÿฌ์›Œ์งˆ ๊ฑฐ์•ผ. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ƒˆ๋กœ์šด ์žฌ๋Šฅ์„ ์ตํžˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ. ๐ŸŒฑ

๊ธฐ์–ตํ•ด, ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์„ธ๊ณ„๋Š” ๋์—†์ด ๋„“๊ณ  ๊นŠ์–ด. ์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ๋Š” ๊ทธ ์ค‘ ํ•˜๋‚˜์˜ ๋ฉ‹์ง„ ์˜์—ญ์ผ ๋ฟ์ด์•ผ. ๊ณ„์†ํ•ด์„œ ํ˜ธ๊ธฐ์‹ฌ์„ ๊ฐ€์ง€๊ณ  ์ƒˆ๋กœ์šด ๊ฒƒ์„ ๋ฐฐ์šฐ๊ณ  ๋„์ „ํ•ด๋‚˜๊ฐ€๊ธธ ๋ฐ”๋ผ! ๐Ÿš€

์ž, ์ด์ œ ๋„ˆ์˜ ์ฐจ๋ก€์•ผ. ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ๋‚ด์šฉ์„ ๊ฐ€์ง€๊ณ  ๋ฉ‹์ง„ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด๋ณผ ์ค€๋น„๊ฐ€ ๋๋‹ˆ? ํ™”์ดํŒ…! ๐Ÿ‘Š๐Ÿ˜„