> [!date] published: 2022-02-27 ## πŸš€ κ°œμš” UNIX μ‹œκ·Έλ„μ„ μ΄μš©ν•˜μ—¬ λ¬Έμžμ—΄μ„ μ†‘μˆ˜μ‹ ν•˜λŠ” λ‘κ°œμ˜ ν”„λ‘œκ·Έλž¨ λ§Œλ“€κΈ°. ## πŸš€ Mandatory Part μš”κ΅¬μ‚¬ν•­ 1. client와 server λΌλŠ” 이름을 κ°€μ§„ 두 μ‹€ν–‰νŒŒμΌμ„ λ§Œλ“€κΈ°. 2. μ΅œλŒ€ 1개의 μ „μ—­λ³€μˆ˜λ§Œ μ‚¬μš©ν•˜κΈ° 3. μ‚¬μš©ν•  수 μžˆλŠ” UNIX μ‹œκ·Έλ„μ€ `SIGUSR1`κ³Ό `SIGUSR2` 2개 뿐. 4. λΉ λ₯΄κ²Œ μ „μ†‘ν•˜κΈ° (100κΈ€μžμ— 1μ΄ˆλŠ” λ„ˆλ¬΄ λŠλ¦¬λ‹€.) ## πŸš€ Mandatory κ΅¬ν˜„μ— μ‚¬μš©ν•œ ν•¨μˆ˜ ### ✨ Signal κ΄€λ ¨ #### kill ```c #include <signal.h> int kill(pid_t pid, int sig); ``` 맀뉴얼 λ³΄λŠ” 법 `man 2 kill` `sig`κ°€ μ˜λ―Έν•˜λŠ” signal을 `pid`λΌλŠ” process idλ₯Ό κ°€μ§„ ν”„λ‘œμ„ΈμŠ€λ‘œ μ „μ†‘ν•œλ‹€. - `pid` > 0 `sig`λ₯Ό `pid`와 λ™μΌν•œ ν”„λ‘œμ„ΈμŠ€ idλ₯Ό κ°€μ§„ ν”„λ‘œμ„ΈμŠ€λ‘œ μ „μ†‘ν•œλ‹€. - `pid` == 0 sender와 λ™μΌν•œ process group idλ₯Ό κ°€μ§„ ν”„λ‘œμ„ΈμŠ€μ— λͺ¨λ‘ `sig`λ₯Ό μ „μ†‘ν•œλ‹€. (senderκ°€ 전솑할 수 μžˆλŠ” κΆŒν•œμ΄ μžˆμ–΄μ•Ό ν•œλ‹€.) - `pid` == -1 μœ μ €κ°€ super user κΆŒν•œμ„ κ°–κ³  μžˆμ„ 경우 : μ‹œμŠ€ν…œ ν”„λ‘œμ„ΈμŠ€μ™€ ν˜„μž¬ μ‹œκ·Έλ„μ„ μ „μ†‘ν•˜κ³  μžˆλŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό μ œμ™Έν•œ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ œμ™Έν•œ λͺ¨λ“  ν”„λ‘œμ„ΈμŠ€μ— μ‹œκ·Έλ„μ΄ μ „μ†‘λœλ‹€. μœ μ €κ°€ super userκ°€ 아닐 경우 : ν˜„μž¬ μ‹œκ·Έλ„μ„ μ „μ†‘ν•˜κ³  μžˆλŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό μ œμ™Έν•˜κ³  μœ μ €μ™€ 같은 `uid`λ₯Ό κ°€μ§„ ν”„λ‘œμ„ΈμŠ€ μ „μ²΄μ—κ²Œ μ‹œκ·Έλ„μ„ μ „μ†‘ν•œλ‹€. λ§Œμ•½ μ–΄λ–€ ν”„λ‘œμ„ΈμŠ€μ—λ„ μ‹œκ·Έλ„μ„ μ „μ†‘ν•˜μ§€ λͺ»ν•˜λ”라도 μ—λŸ¬λŠ” λ°œμƒν•˜μ§€ μ•ŠλŠλ‹€. - `pid` < -1 group idκ°€ `pid`의 μ ˆλŒ“κ°’κ³Ό 같은 λͺ¨λ“  ν”„λ‘œμ„ΈμŠ€μ— μ‹œκ·Έλ„μ΄ μ „μ†‘λœλ‹€. λ°˜ν™˜κ°’: 성곡 μ‹œ 0, μ‹€νŒ¨ μ‹œ -1 #### signal ```c #include <signal.h> void (*signal(int sig, void (*func)(int));)(int); ``` μ–΄λ–€ ν”„λ‘œμ„ΈμŠ€μ— μ‹œκ·Έλ„μ΄ λ„μ°©ν•œλ‹€λ©΄, ν”„λ‘œμ„ΈμŠ€κ°€ ν•  수 μžˆλŠ” 일은 λŒ€λΆ€λΆ„ 3가지인데 - μ •μ˜λ˜μ–΄μžˆλŠ” κΈ°λ³Έ λ™μž‘ - ν”„λ‘œμ„ΈμŠ€ μ’…λ£Œ - μ‹œκ·Έλ„ λ¬΄μ‹œ - μœ μ €κ°€ μ •μ˜ν•œ action signal ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ μœ„μ˜ λ‚΄μš©λ“€μ„ μ„€μ •ν•˜λ €λ©΄ `func` 의 λ‚΄μš©μ„ μ„€μ •ν•˜λ©΄ λœλ‹€. - μ •μ˜λ˜μ–΄μžˆλŠ” κΈ°λ³Έ λ™μž‘ -> `SIG_DFL` - μ‹œκ·Έλ„ λ¬΄μ‹œ -> `SIG_IGN` - μœ μ €κ°€ μ •μ˜ν•œ action -> `func`에 ν•΄λ‹Ήν•˜λŠ” ν•¨μˆ˜ 인자둜 μ „λ‹¬ν•˜κΈ° (ν•¨μˆ˜ ν”„λ‘œν† νƒ€μž…μ„ 보면 μ•Œκ² μ§€λ§Œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•Œμ—λŠ”` int`ν˜• 인자 1개λ₯Ό κ°–λŠ” ν•¨μˆ˜λ‘œ μ •μ˜ν•΄μ•Ό ν•œλ‹€.) action이 μ„±κ³΅ν–ˆμ„ κ²½μš°μ—λŠ” 이전 action (μ•„λ§ˆλ„ `func`의 ν•¨μˆ˜ 포인터인 것 κ°™λ‹€.)이 λ°˜ν™˜λœλ‹€. ### ✨ Process κ΄€λ ¨ #### getpid ```c #include <unistd.h> pid_t getpid(void); ``` ν˜„μž¬ ν”„λ‘œμ„ΈμŠ€μ˜ pidλ₯Ό λ°˜ν™˜ν•œλ‹€. 항상 μ„±κ³΅ν•˜κΈ° λ•Œλ¬Έμ— error에 λŒ€ν•œ λ°˜ν™˜κ°’μ€ μ—†λ‹€. `pid_t`λŠ” process idλ₯Ό λ‚˜νƒ€λ‚΄κΈ° μœ„ν•œ μžλ£Œν˜•μ΄κ³  `<sys/types.h>`에 μ •μ˜λ˜μ–΄ μžˆλŠ”λ° λΆ€ν˜Έ μžˆλŠ” μ •μˆ˜ μžλ£Œν˜•μ„ μ˜λ―Έν•œλ‹€. ([c - Size of pid_t, uid_t, gid_t on Linux - Stack Overflow](https://stackoverflow.com/questions/1922761/size-of-pid-t-uid-t-gid-t-on-linux)) #### exit ```c #include <stdlib.h> void exit(int status); ``` 맀뉴얼 λ³΄λŠ” 법 `man 3 exit` ν”„λ‘œμ„ΈμŠ€λ₯Ό μ’…λ£Œν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. `status` κ°’μœΌλ‘œ `EXIT_SUCCESS`와 `EXIT_FAILURE`λ₯Ό κ°€μ§ˆ 수 μžˆλŠ”λ° 각각 0κ³Ό 1둜 μ •μ˜λ˜μ–΄ μžˆλ‹€. ## πŸš€ λ¬Έμžμ—΄ 전솑 (ASCII) 2개의 μ‹œκ·Έλ„μ„ μ‚¬μš©ν•  수 있기 λ•Œλ¬Έμ— ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ λ¬Έμžμ—΄μ„ λΉ„νŠΈ λ‹¨μœ„λ‘œ μͺΌκ°œμ„œ μ„œλ²„ μͺ½μœΌλ‘œ 전솑해주면 λœλ‹€. 말둜 μ„€λͺ…ν•˜λŠ” 것 λ³΄λ‹€λŠ” 그림으둜 μ„€λͺ…ν•˜λŠ”κ²ƒμ΄ 더 이해가 잘 될 것 κ°™μ•„μ„œ μžμ„Έν•œ λ‚΄μš©μ€ 그림으둜 λŒ€μ‹ ν•œλ‹€. ![[29e18d15-ef96-41b5-9069-7ebe5bc1dbc1.png]] ## πŸš€ λ°˜μ„±.. ν΄λΌμ΄μ–ΈνŠΈ μ‹€ν–‰ μ‹œ `pid`와 전솑할 λ¬Έμžμ—΄μ„ 인자둜 λ„£κ²Œ λ˜λŠ”λ° `pid`에 λŒ€ν•œ ν…ŒμŠ€νŠΈκ°€ λΆ€μ‘±ν•˜μ—¬ ν‰κ°€μžκ°€ μ œμ‹œν•œ ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€μ—μ„œ μ˜ˆμƒκ³Ό λ‹€λ₯Έ κ²°κ³Όκ°€ λ‚˜μ˜€λŠ” λ¬Έμ œκ°€ μžˆμ—ˆλ‹€. μ΄λŠ” pid의 값을 λ°›μ•„μ˜¬ λ•Œ λ‹¨μˆœνžˆ `ft_atoi`λ§Œμ„ μ‚¬μš©ν–ˆμ—ˆκΈ° λ•Œλ¬ΈμΈλ° μ’€ 더 λ‹€μ–‘ν•œ μΌ€μ΄μŠ€λ“€μ„ κ²€ν† ν•΄λ΄€μœΌλ©΄ 금방 찾을 수 μžˆλŠ” λ¬Έμ œμ—¬μ„œ μ’€ 아쉬웠닀.