๊ฐ๊ฐ ์คํํ๋ ๋ฐฉ๋ฒ์:
./server
pid๋ฅผ ์๋ ค์ค๋ค. getpid()ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
pause()์ํ์ ๊ฑธ๋ฆฐ๋ค.
./client
server์์ ๋ณด์ฌ์ค pid์ ๋ณด๋ผ ๋ฉ์ธ์ง๋ฅผ ์ ์ด ์คํ์ํค๋ฉด
server์ ์คํ์์ผ๋ ์ฐฝ์์ ๋ฉ์ธ์ง\n๊ฐ ์ถ๋ ฅ๋๋ค.
ft_putnbr(getpid());
ft_putchar("\n");
while(1)
pause();
if(argc < 3)
return (-1);
len = ft_strlen(argv[2]) + 1;
์ธ์๋ ์์๋๋ก ๋ค์ด์จ ์๊ทธ๋, ์ฒ๋ฆฌํ ๋ฐฉ๋ฒ์ ๊ตฌ์กฐ์ฒด ์ฃผ์, ๊ธฐ์กด ์ฒ๋ฆฌ๋ฐฉ๋ฒ ๊ตฌ์กฐ์ฒด ์ฃผ์
ex> sigaction(SIGUSR1, action, 0): SIGUSR1์ด๋ผ๋ ์๊ทธ๋์ 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๊ตฌ์กฐ์ฒด๋ ํจ์๋ ์๊ทธ๋์ ๋ฐ๊ณ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด ์ค๋ค๋๊ฑด ์๊ฒ ๋ค.
์ฐธ๊ณ ๋ก ์์์ ๋งํ๋ 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์ด๋ผ๋ ์๊ทธ๋์ด ๋ค์ด์์ ๋ ์๋์ํฌ handler ํ๋์
SIGUSR2๋ผ๋ ์๊ทธ๋์ด ๋ค์ด์์ ๋ ์๋์ํฌ handler ํ๋
์ด๋ ๊ฒ 2๊ฐ๋ง ๊ฐ์ง๊ณ clientํ๋ก๊ทธ๋จ์ผ๋ก๋ถํฐ serverํ๋ก๊ทธ๋จ์ผ๋ก ๋ฉ์ธ์ง๋ฅผ ์ ๋ฌ๋ฐ๊ฒ ํด์ผํ๋ค.
๋ณด๋ผ์ ์๋ ์๊ทธ๋์ด 2๊ฐ๋ผ๋ ์ ์์ ์ด๋ฏธ 2์ง๋ฒ๊ณผ ๋นํธ์ฐ์ฐ์ ์ฌ์ฉํด์ผ ํ๋ค๋ ๊ฒ์ ๋ ์ฌ๋ ธ๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ๋นํธ์ฐ์ฐ์ผ๋ก ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ผ๊ฒ์ธ๊ฐ?
๐ก *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๋ก ์ด๋ป๊ฒ ๋ฐ๊ฟ๊ฒ์ธ๊ฐ...?
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์ ํธ๋ฅผ ๋ณด๋ด๋ ๊ฒ๋ ๋ฌธ์ ์๋ค
์ด์ ์๊ฐํด๋ณด์...
ํ์ฌ ์ฐ๋ฆฌ๋ SIGUSR1 ํน์ 2๊ฐ ์ค์ง์ด ๋ค์ด์ค๊ธฐ ์ง์ ์ ์ํฉ์ด๋ค.
SIGUSR1์ 1, SIGUSR2๋ 0์ด๋ค.
์๊ทธ๋์ ๋ฐ์ ํธ๋ค๋ง ํ๋ ค๋ฉด
- ๋์ ๊ฐ์ ๋ค๋ฅธ ํธ๋ค๋ง ๊ตฌ์กฐ์ฒดorํจ์์ ๋ฃ์ด์ฃผ๊ฑฐ๋
- ํ๊ตฐ๋ฐ ๋ฃ์ด์ if๋ฌธ์ผ๋ก ๊ตฌ๋ถํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
2๋ฒ์ ์ ํํ๋ค.
sigaction(SIGUSR1, &action, 0)
, sigaction(SIGUSR2, &action, 0)
์ด๋ ์ ํธ๋ ๋ฐ์ action์ผ๋ก ๋ค์ด์ handleํด์ค ํจ์๋ฅผ ์ฐพ์๊ฒ์ด๋ค
- sa_handler๋ก ํด์ฃผ๊ธฐ
- 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์ ์ ํํ๋ค๊ณ ํ์๋ค.
์ด๊ฑฐ ์ ์๋๋์ง
-
์ฐ์ ์ ์ด๋ ๊ฒ ์๋๋ฐ...
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)...
sigaction(SIGUSR1, &action, 0)
siginfo_t๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ผ์ด ์์ผ๋
sa_handler๋ฅผ ์ฌ์ฉํด _signal.word >>= 1 ํ๋ค.
เฟ เฟ เฟ ๋ เฟฟ
๎๎๎๎๎๎ ๎๎๎๎๎๎๎๎๎๎
https://unicode-table.com/kr/#basic-latin
emoji: ๐คโโโโ โโ ๐ฅโโฃโฎ๐๐ฑโ ซ๐โฌ๐๐ฆ๐โฝ๐ต๐งโป
200์ (400byte): โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ
strlen์ผ๋ก ํ ๊ธ์๋ง๋ค ์ ์ก์ด ๋๋ฌ๋ค๋ ์ ํธ๋ฅผ ๋ณด๋ด๊ธฐ ๋๋ฌธ์ 4๋ฐ์ดํธ๋ฅผ ์ฐจ์งํ๋ ์ ๋์ฝ๋๋ ์ ์ ์ก๋จ https://stackoverflow.com/questions/10017328/unicode-stored-in-c-char
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;
}