Giter Club home page Giter Club logo

minitalk's Introduction

โ•๊ณผ์ œ ๋ชฉํ‘œ

โ€ผ๏ธclient์™€ server๋ผ๋Š” ์‹คํ–‰ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ ๋‹ค.

๊ฐ๊ฐ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€:

./server

pid๋ฅผ ์•Œ๋ ค์ค€๋‹ค. getpid()ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

pause()์ƒํƒœ์— ๊ฑธ๋ฆฐ๋‹ค.

./client

server์—์„œ ๋ณด์—ฌ์ค€ pid์™€ ๋ณด๋‚ผ ๋ฉ”์„ธ์ง€๋ฅผ ์ ์–ด ์‹คํ–‰์‹œํ‚ค๋ฉด

server์„ ์‹คํ–‰์‹œ์ผœ๋‘” ์ฐฝ์—์„œ ๋ฉ”์„ธ์ง€\n๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

โ€ผ๏ธ์•„๋ž˜์— ๋‚˜์˜ฌ ์ด์™ธ ์—ฌ๋Ÿฌ ์กฐ๊ฑด๋“ค์ด ์žˆ๋‹ค.

-1. server์—์„œ pid์ถœ๋ ฅํ•˜๊ธฐ & pause()์ƒํƒœ ๋งŒ๋“ค๊ธฐ

โ€ผ๏ธ์กฐ๊ฑด: getpid()๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ํ—ˆ์šฉ๋˜์–ด์žˆ๋‹ค.

ft_putnbr(getpid());
ft_putchar("\n");
while(1)
	pause();

-1. client์— ์ •์ƒ ์ž…๋ ฅ ํ™•์ธ & ์ž…๋ ฅ๋œ ๋ฌธ์ž ๊ธธ์ด ์ €์žฅ

if(argc < 3)
	return (-1);

len = ft_strlen(argv[2]) + 1;

0. sigactionํ•จ์ˆ˜

โ€ผ๏ธ์กฐ๊ฑด: sigactionํ•จ์ˆ˜๊ฐ€ ํ—ˆ์šฉ๋˜์–ด์žˆ๋‹ค.

๐Ÿ’ก int sigaction(int signum, const struct sigaction *act, sturct sigaction *oldact)

์ธ์ž๋Š” ์ˆœ์„œ๋Œ€๋กœ ๋“ค์–ด์˜จ ์‹œ๊ทธ๋„, ์ฒ˜๋ฆฌํ•  ๋ฐฉ๋ฒ•์˜ ๊ตฌ์กฐ์ฒด ์ฃผ์†Œ, ๊ธฐ์กด ์ฒ˜๋ฆฌ๋ฐฉ๋ฒ• ๊ตฌ์กฐ์ฒด ์ฃผ์†Œ

ex> sigaction(SIGUSR1, action, 0): SIGUSR1์ด๋ผ๋Š” ์‹œ๊ทธ๋„์„ action๊ตฌ์กฐ์ฒด์— ์ ํžŒ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ด์ „ ์ฒ˜๋ฆฌ๋ฐฉ๋ฒ•์€ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค

1. struct sigaction ๊ตฌ์กฐ์ฒด (action)

  • #include <signal.h>์— ์ •์˜๋˜์–ด ์žˆ๋‹ค.
struct sigaction
{
	void (*sa_handler)(int);
		// signal์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ•ธ๋“ค๋Ÿฌ
	void (*sa_sigaction)(int, siginfo_t*, void*);
		// signal์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ•ธ๋“ค๋Ÿฌ2
		// ์ธ์ž๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•  ์‹œ๊ทธ๋„, ์ฒ˜๋ฆฌํ•  ๋ฐฉ๋ฒ•์˜ ๊ตฌ์กฐ์ฒด ์ฃผ์†Œ, ๊ธฐ์กด ์ฒ˜๋ฆฌ๋ฐฉ๋ฒ• ๊ตฌ์กฐ์ฒด ์ฃผ์†Œ
	sigset_t sa_mask;
		//์‹œ๊ทธ๋„์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ ๋ธ”๋ก(๋‚˜์ค‘์— ์ฒ˜๋ฆฌํ•˜๊ฒŒ ์˜ˆ์•ฝ)์‹œํ‚ฌ ์‹œ๊ทธ๋„์„ ๋ชจ์•„๋†“์€ ๋ณ€์ˆ˜์ด๋‹ค
		//๋”ฐ๋ผ์„œ sigemptyset()์„ ํ†ตํ•ด action๊ตฌ์กฐ์ฒด์˜ sa_mask๋ณ€์ˆ˜๋ฅผ ๋น„์›Œ์ค€๋‹ค๋ฉด ๋ชจ๋“  ์‹œ๊ทธ๋„์ด ๋ธ”๋กœํ‚น๋˜์ง€ ์•Š๋Š”๋‹ค
	int sa_flags;
		//์˜ต์…˜์„ค์ •: ex>SA_SIGINFO : sa_handler ๋Œ€์‹  sa_sigaction์„ ์ž‘๋™์‹œํ‚ด
		//๋” ์ž์„ธํ•œ flag๋Š” -> https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=skssim&logNo=121271980
	void (*sa_restorer)(void);  
		// ์ด๋ฒˆ ๊ณผ์ œ์—์„œ๋Š” ์‚ฌ์šฉX
}

ํ•จ์ˆ˜ ๋‚ด์— struct sigaction action; ์œผ๋กœ sigaction๊ตฌ์กฐ์ฒด์— action์ด๋ผ๋Š” ์ด๋ฆ„์„ ๋‹ฌ์•„ ์‚ฌ์šฉํ•œ๋‹ค.

๊ตฌ์กฐ์ฒด ๊ณต๋ถ€๋Š” ์—ฌ๊ธฐ์„œ:(๋…ธํŠธํ•„๊ธฐ ์˜ฎ๊ธฐ๊ฒŸ์Šต๋‹ˆ๋‹ค...)

โš ๏ธ sigactionํ•จ์ˆ˜์™€ sigaction๊ตฌ์กฐ์ฒด์˜ sa_sigactionํ•จ์ˆ˜๋Š” ๋‹ค๋ฅด๋‹ค! ๋น„์Šทํ•ด ๋ณด์ด์ง€๋งŒ ์ฒ˜๋ฆฌํ•  ๋ฐฉ๋ฒ•์ด ๋‹ด๊ธด ๊ตฌ์กฐ์ฒด ์ž์ฒด๊ฐ€ ๋‹ค๋ฆ„

์šฐ์„  ๋Œ€์ถฉ sigaction๊ตฌ์กฐ์ฒด๋„ ํ•จ์ˆ˜๋„ ์‹œ๊ทธ๋„์„ ๋ฐ›๊ณ  ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด ์ค€๋‹ค๋Š”๊ฑด ์•Œ๊ฒ ๋‹ค.

2. signal์ด๋ž€?

โ€ผ๏ธ์กฐ๊ฑด: signalํ•จ์ˆ˜๊ฐ€ ํ—ˆ์šฉ๋˜์–ด์žˆ๋‹ค.

๐Ÿ’ก void (*signal(int signum, void (*handler)(int)))(int);

์ฐธ๊ณ ๋กœ ์œ„์—์„œ ๋งํ•˜๋˜ signal์€ ์ด ํ•จ์ˆ˜์—์„œ์˜ signum์— ๋“ค์–ด๊ฐ„๋‹ค.

void interruptHandler(int sig){
        printf("this program will be exited in 3 seconds..\n");
        sleep(3);
        exit(0);
}
int main(){
        signal(SIGINT, interruptHandler); 
        printf("input Ctrl+C\n");
        while(1);
}

์‹คํ–‰ํ›„ Ctrl+C๋ฅผ ๋ˆŒ๋Ÿฌ SIGINT์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด์ฃผ๋ฉด interrupHandlerํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

2๋ฒˆ ์‹œ๊ทธ๋„์ธ SIGINT๋Š” #define SIGINT 2๋กœ ๋งคํฌ๋กœํ™” ๋˜์–ด์žˆ์œผ๋ฉฐ Ctrl+C๋กœ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

์œ„ ์ฝ”๋“œ ์ถœ์ฒ˜ & SIGINT ์ด์™ธ์˜ ๋” ๋งŽ์€ ์ข…๋ฅ˜๋Š” โ†’ https://reakwon.tistory.com/46

โ€ผ๏ธ์กฐ๊ฑด: ์ด๋ฒˆ ๊ณผ์ œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ทธ๋„์€ SIGUSR1, SIGUSR2 ๋‘๊ฐ€์ง€๋‹ค.

์ฆ‰ ์šฐ๋ฆฌ๋Š” SIGUSR1์ด๋ผ๋Š” ์‹œ๊ทธ๋„์ด ๋“ค์–ด์™”์„ ๋•Œ ์ž‘๋™์‹œํ‚ฌ handler ํ•˜๋‚˜์™€

SIGUSR2๋ผ๋Š” ์‹œ๊ทธ๋„์ด ๋“ค์–ด์™”์„ ๋•Œ ์ž‘๋™์‹œํ‚ฌ handler ํ•˜๋‚˜

์ด๋ ‡๊ฒŒ 2๊ฐœ๋งŒ ๊ฐ€์ง€๊ณ  clientํ”„๋กœ๊ทธ๋žจ์œผ๋กœ๋ถ€ํ„ฐ serverํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ฉ”์„ธ์ง€๋ฅผ ์ „๋‹ฌ๋ฐ›๊ฒŒ ํ•ด์•ผํ•œ๋‹ค.

๋ณด๋‚ผ์ˆ˜ ์žˆ๋Š” ์‹œ๊ทธ๋„์ด 2๊ฐœ๋ผ๋Š” ์ ์—์„œ ์ด๋ฏธ 2์ง„๋ฒ•๊ณผ ๋น„ํŠธ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋– ์˜ฌ๋ ธ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋น„ํŠธ์—ฐ์‚ฐ์œผ๋กœ ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ผ๊ฒƒ์ธ๊ฐ€?

3. ๋น„ํŠธ๋งˆ์Šคํ‚น

๐Ÿ’ก *1 & 1 โ†’ 1* &์—ฐ์‚ฐ์€ ๋‘ ์ž…๋ ฅ์ด ๋ชจ๋‘ 1์ผ๋•Œ๋งŒ 1์„ ์ถœ๋ ฅํ•˜๊ณ  ๋‚˜๋จธ์ง„ ์ „๋ถ€ 0์„ ์ถœ๋ ฅํ•œ๋‹ค.

๋ณด๋‚ด๋ ค๋Š” ๋ฉ”์„ธ์ง€ "a" == 97 == (0b) 0110 0001 ๊ณผ

๊ธฐ๋ณธ๊ฐ’ (0b) 1000 0000 ์—์„œ ํ•˜๋‚˜์”ฉ >>ํ•˜๋ฉฐ

&์—ฐ์‚ฐํ•˜๋ฉด...

๋ฉ”๋ชจ์žฅ

๋”ฐ๋ผ์„œ 1000 0000 ๋ถ€ํ„ฐ 1์˜ ์œ„์น˜๋ฅผ >>(์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™) ํ•˜๋ฉฐ ์–ด๋–ค ๋ฌธ์ž๊ฐ€ ๋“ค์–ด์™”๋Š”์ง€ ์Šค์บ”ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ดˆ๊ธฐ์— ๋ฌธ์ž ๊ธธ์ด๋ฅผ len์— ์ €์žฅํ•ด๋‘์—ˆ์œผ๋‹ˆ len๋งŒํผ ๋ฐ˜๋ณตํ•œ๋‹ค.

_signal๊ตฌ์กฐ์ฒด์˜ bit(unsigned int์ž„)์— ๊ธฐ์ดˆ๊ฐ€ ๋˜๋Š” 0b 1000 0000๋ฅผ ์ €์žฅํ•ด๋†“๊ณ  ์ „๋ถ€ 0์ด ๋  ๋•Œ๋งˆ๋‹ค ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๋„๋ก ํ•˜์ž

_signal.bit = 0b1000000;

์ด์ œ ์šฐ๋ฆฌ๋Š” _signal.bit๋ฅผ >>, & ํ•˜๋ฉด ๋“ค์–ด์˜จ ๋ฌธ์ž๋ฅผ 2์ง„๋ฒ•์œผ๋กœ ์ชผ๊ฐœ ์Šค์บ”ํ•˜์—ฌ 1์ธ์ง€ 0์ธ์ง€ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์•„์ง ์šฐ๋ฆฌ๋Š” client์•ˆ์— ์žˆ๋‹ค.

1์ธ์ง€ 0์ธ์ง€ ์•Œ์•„๋ƒˆ๋‹ค๋ฉด ๊ทธ๊ฑธ SIGUSR1, SIGUSR2๋กœ ์–ด๋–ป๊ฒŒ ๋ฐ”๊ฟ€๊ฒƒ์ธ๊ฐ€...?

4. killํ•จ์ˆ˜

โ€ผ๏ธ์กฐ๊ฑด: killํ•จ์ˆ˜๊ฐ€ ํ—ˆ์šฉ๋˜์–ด์žˆ๋‹ค.

https://man7.org/linux/man-pages/man2/kill.2.html

๐Ÿ’ก int kill(pid_t pid, int sig);

kill์ด๋ผํ•ด์„œ ์‹คํ–‰์„ ์ข…๋ฃŒ์‹œํ‚ค๋‚˜...๋ฅผ ์ƒ๊ฐํ–ˆ์ง€๋งŒ ๊ทธ๊ฑด sig์œผ๋กœ SIGKILL์„ ์ฃผ์—ˆ์„๋•Œ์ด๋‹ค.

์ฆ‰ pid๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ๊ทธ ๊ณณ์— sig๋ฅผ ๋ณด๋‚ด๋Š” ํ•จ์ˆ˜!

(์ฐธ๊ณ ๋กœ ๋ฐ˜ํ™˜๊ฐ’์€ ์„ฑ๊ณต์‹œ 0 ์‹คํŒจ์‹œ -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.)

_signal.pid = ft_atoi(argv[1]);

while (_signal.bit)
{
	if(argv[2] & _signal.bit)
		kill(_signal.pid, SIGUSR1);
	else
		kill(_signal.pid, SIGUSR2);
}

client๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ๋•Œ server์˜ pid(==argv[1])์™€ ๋ณด๋‚ผ ๋ฉ”์„ธ์ง€(==argv[2])๋ฅผ ๋ฐ›์•˜์Œ

์ด์ œ server๋กœ SIGUSR์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ๋„ ๋ฌธ์ œ ์—†๋‹ค

5. server์—์„œ ๋ฌธ์ž ์ˆ˜์‹ ํ•˜๊ธฐ

์ด์ œ ์ƒ๊ฐํ•ด๋ณด์ž...

ํ˜„์žฌ ์šฐ๋ฆฌ๋Š” SIGUSR1 ํ˜น์€ 2๊ฐ€ ์ค„์ง€์–ด ๋“ค์–ด์˜ค๊ธฐ ์ง์ „์˜ ์ƒํ™ฉ์ด๋‹ค.

SIGUSR1์€ 1, SIGUSR2๋Š” 0์ด๋‹ค.

์‹œ๊ทธ๋„์„ ๋ฐ›์•„ ํ•ธ๋“ค๋ง ํ•˜๋ ค๋ฉด

  1. ๋‘˜์„ ๊ฐ์ž ๋‹ค๋ฅธ ํ•ธ๋“ค๋ง ๊ตฌ์กฐ์ฒดorํ•จ์ˆ˜์— ๋„ฃ์–ด์ฃผ๊ฑฐ๋‚˜
  2. ํ•œ๊ตฐ๋ฐ ๋„ฃ์–ด์„œ if๋ฌธ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

2๋ฒˆ์„ ์„ ํƒํ–ˆ๋‹ค.

sigaction(SIGUSR1, &action, 0), sigaction(SIGUSR2, &action, 0)

์–ด๋Š ์‹ ํ˜ธ๋“  ๋ฐ›์•„ action์œผ๋กœ ๋“ค์–ด์™€ handleํ•ด์ค„ ํ•จ์ˆ˜๋ฅผ ์ฐพ์„๊ฒƒ์ด๋‹ค

  1. sa_handler๋กœ ํ•ด์ฃผ๊ธฐ
  2. sa_sigaction๋กœ ํ•ด์ฃผ๊ธฐ

siginfo_t๊ตฌ์กฐ์ฒด์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— 2๋ฒˆ์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค.

sa_sigaction์œผ๋กœ ๋“ค์–ด์™€ ์–ด๋–ป๊ฒŒ 2์ง„๋ฒ•์œผ๋กœ ์ชผ๊ฐœ์ง„ ๋ฌธ์ž๋ฅผ ๋‹ค์‹œ ๊ธฐ์กด ๋ฌธ์ž๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

์šฐ์„  ๊ธฐ์กด ๋ฌธ์ž๋ฅผ ๋‹ด์„ ๋ณ€์ˆ˜๋ฅผ ํ•˜๋‚˜ ์ง€์ •ํ•œ๋‹ค.

_signal๊ตฌ์กฐ์ฒด์˜ word๋ผ๊ณ  ์ง€์–ด์ฃผ๊ฒ ๋‹ค (๋‹น์—ฐํžˆ charํ˜•์ž„)

์ด๊ณณ์— SIGUSR1์ผ๋•Œ๋งŒ 1์„ ๋ณต์‚ฌ(ํ•ด๋‹น ์ž๋ฆฌ์— 1์„ ๋„ฃ์–ด์•ผํ•˜๋‹ˆ +=)ํ•ด์ฃผ๊ณ  >> ํ•˜์—ฌ ๋‹ค์Œ์œผ๋กœ ๋„˜๊ธด๋‹ค.

SIGUSR2์ผ๋•Œ๋Š” ๊ทธ๋ƒฅ >>ํ•ด์ค€๋‹ค! ์–ด์งœํ”ผ 0์—๋‹ค 0์„ ๋”ํ•ด๋„ ์•ˆ๋”ํ•ด๋„ 0์ด๋‹ˆ

if (sig == SIGUSR1)
		_signal.word += _signal.bit;
_signal.bit >>= 1;

์ด์ œ word์— client๊ฐ€ ๋ณด๋‚ธ ๋ฉ”์„ธ์ง€๊ฐ€ 8๋น„ํŠธ์–ด์น˜(ํ•œ๊ธ€์ž) ๋‹ด๊ฒผ์„๊ฒƒ์ด๋‹ค.

bit์—์„œ ์ „๋ถ€ ๊ฐ€์ ธ์™”๋Š”์ง€ ํ™•์ธ ํ›„ (bit == 0) ์ „๋ถ€ ๋ณต์‚ฌํ–ˆ๋‹ค๋ฉด word๋ฅผ putchar๋กœ ์ถœ๋ ฅํ•ด์ค€๋‹ค.

์•—! ๋ฌธ์ž์—ด์ด ์•ˆ๋“ค์–ด์™”๋‹ค๋ฉด? ์ผ๋‹จ ์ถœ๋ ฅํ–ˆ๋Š”๋ฐ ๊ทธ๊ฒŒ ๋งˆ์ง€๋ง‰ ๊ธ€์ž ์˜€๋‹ค๋ฉด? (word == 0) gnl์—์„œ ๊ทธ๋žฌ๋“ฏ "\n"์„ ์ถœ๋ ฅํ•ด์ค€๋‹ค.

ํ•œ ๊ธ€์ž ์Šค์บ”๊ณผ ์ถœ๋ ฅ์ด ๋๋‚ฌ์œผ๋‹ˆ bit์™€ word๋ฅผ ๋‹ค์‹œ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค.

usleep()์„ ํ†ตํ•ด ๊ธ€์ž ์ถœ๋ ฅ ์‚ฌ์ด์— ์‹œ๊ฐ„์„ ์ค€๋‹ค.

(์‹œ๊ฐ„์„ ์ฃผ๋Š” ์ด์œ ๋Š” ๋ชป ์ฐพ์Œ ์ถœ๋ ฅ ๋น ๋ฅด๋ฉด ์ข‹์€๊ฑฐ ์•„๋‹Œ๊ฐ€?)

์•„๊นŒ ์œ„์—์„œ siginfo_t๊ตฌ์กฐ์ฒด์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด sa_sigaction์„ ์„ ํƒํ–ˆ๋‹ค๊ณ  ํ•˜์˜€๋‹ค.

6. siginfo_t๊ตฌ์กฐ์ฒด?

์ด๊ฑฐ ์™œ ์•ˆ๋๋‚˜์ง€

  • ์šฐ์„ ์€ ์ด๋ ‡๊ฒŒ ์žˆ๋Š”๋ฐ...

    int si_signo; //์‹œ๊ทธ๋„ ๋„˜๋ฒ„
    int si_errno; //errno ๊ฐ’
    int si_code; //์‹œ๊ทธ๋„ ์ฝ”๋“œ
    pid_t si_pid; //ํ”„๋กœ์„ธ์Šค ID ๋ณด๋‚ด๊ธฐ
    uid_t si_uid; //ํ”„๋กœ์„ธ์Šค๋ฅผ ์ „์†กํ•˜๋Š”์‹ค์ œ ์‚ฌ์šฉ์ž ID
    int si_status; //Exit๊ฐ’ ๋˜๋Š” ์‹œ๊ทธ๋„
    clock_t si_utime; //์†Œ๋ชจ๋œ ์‚ฌ์šฉ์ž ์‹œ๊ฐ„
    clock_t si_stime; //์†Œ๋ชจ๋œ ์‹œ์Šคํ…œ ์‹œ๊ฐ„
    sigval_t si_value; //์‹œ๊ทผ๋Ÿฌ ๊ฐ’
    int si_int; //POSIX.1b ์‹œ๊ทธ๋„
    void* si_ptr; //POSIX.1b ์‹œ๊ทธ๋„
    void* si_addr; //์‹คํŒจ๋ฅผ ์ดˆ๋ž˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜
    int si_band; //๋ฐด๋“œ ์ด๋ฒคํŠธ
    int si_fd; //ํŒŒ์ผ ๊ธฐ์ˆ ์ž

์šฐ๋ฆฌ๊ฐ€ ๋ณผ ๊ฑด si_pid๋ฟ์ด๋‹ค.

siginfo_t๊ตฌ์กฐ์ฒด์˜ si_pid๋Š” client์˜ pid๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

killํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด client์— ๋๋‚ฌ๋‹ค๋Š” ์‹œ๊ทธ๋„์„ ๋ณด๋‚ธ๋‹ค (1)

kill(actโ†’si_pid, SIGUSR1)...

7. client์— SIGUSR1์ด ๋“ค์–ด์™”๋‹ค!

sigaction(SIGUSR1, &action, 0)

siginfo_t๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ผ์ด ์—†์œผ๋‹ˆ

sa_handler๋ฅผ ์‚ฌ์šฉํ•ด _signal.word >>= 1 ํ•œ๋‹ค.

8. ์œ ๋‹ˆ์ฝ”๋“œ

เฟš เฟŽ เฟ ๋˜Ÿ เฟฟ

๎€€๎€๎€‚๎€ƒ๎€„๎€…๎€†๎€‡๎€ˆ๎€‰๎€Š๎€‹๎€Œ๎€๎€Ž๎€

https://unicode-table.com/kr/#basic-latin

emoji: ๐Ÿ–คโˆ‘โˆžโ˜žโ˜…โšโœ…๐Ÿ”ฅโŒšโ˜ฃโ˜ฎ๐ŸŒ๐Ÿ“ฑโ…ซ๐Ÿš€โ‚ฌ๐Ÿ”๐Ÿฆ๐Ÿ‘‘โšฝ๐ŸŽต๐ŸŽงโ™ป

200์ž (400byte): โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…

strlen์œผ๋กœ ํ•œ ๊ธ€์ž๋งˆ๋‹ค ์ „์†ก์ด ๋๋‚ฌ๋‹ค๋Š” ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— 4๋ฐ”์ดํŠธ๋ฅผ ์ฐจ์ง€ํ•˜๋Š” ์œ ๋‹ˆ์ฝ”๋“œ๋„ ์ž˜ ์ „์†ก๋จ https://stackoverflow.com/questions/10017328/unicode-stored-in-c-char

9. unused parameter ์ฒ˜๋ฆฌ

https://stackoverflow.com/questions/3599160/how-to-suppress-unused-parameter-warnings-in-c/12891181

action.sa_sigaction = &server_sa_sigaction;

void server_sa_sigation(int i)
{
		(void)i;
		_signal.word_bit >>= 1;
}

minitalk's People

Contributors

niamu01 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.