ºÝºÝߣ

ºÝºÝߣShare a Scribd company logo
[IGRUS] -pineoc ì´ìœ¤ì„
ï½ ì£¼ìš” 챕터
ï½ ê°ê°ì˜ ì±•í„°ì— ëŒ€í•œ ì´ë¡ 
ï½ ì½”ë“œ ë° ì„¤ëª…
ï½ ê³µë¶€í•˜ë©´ì„œ ë°°ìš´ 것, ëŠë‚€ì .
ï½ Ch3. íŒŒì¼ ë‹¤ë£¨ê¸°
ï½ Ch11.프로세스와 신호
ï½ Ch12.쓰레드
ï½ Ch13.프로세스간 통신 : 파ì´í”„
ï½ Ch14. 세마í¬, 공유 메모리, 메시지 í
ï½ Ch15. 소켓
ï½ íŒŒì¼ê³¼ 디렉토리를 다루는 여러 가지 í•¨ìˆ˜ë“¤ì„ ìƒ
세히 설명하는 ë° ì£¼ë ¥.
â—¦ 파ì¼ê³¼ 장치
◦ 시스템 호출
â—¦ ë¼ì´ë¸ŒëŸ¬ë¦¬ 함수
â—¦ íŒŒì¼ ë‹¤ë£¨ê¸°
â—¦ 표준 I/O ë¼ì´ë¸ŒëŸ¬ë¦¬
â—¦ ìž…,출력 ì„œì‹í™”
â—¦ 파ì¼ê³¼ 디렉터리 관리
â—¦ 디렉터리 íƒìƒ‰
â—¦ 오류처리, /proc íŒŒì¼ ì‹œìŠ¤í…œ, fcntlê³¼ mmap
ï½ ì €ìˆ˜ì¤€ íŒŒì¼ ì ‘ê·¼
í•˜ë‚˜ì˜ í”„ë¡œê·¸ëž¨ì´ ì‹œë™ë  ë•Œì—는 ì¼ë°˜ì ìœ¼ë¡œ 세 ê°œì˜ íŒŒì¼ ì„œìˆ ìžë“¤ì´ ì´ë¯¸
열린 ìƒíƒœì´ë‹¤.
- 0 : 표준 입력
- 1 : 표준 출력
- 2 : 표준 오류
ìœ„ì˜ íŒŒì¼ ì„œìˆ ìžëŠ” ìžë™ìœ¼ë¡œ 열리며, ë”°ë¼ì„œ í”„ë¡œê·¸ëž¨ì€ ë³„ë‹¤ë¥¸ 절차 ì—†ì´
Write를 ì´ìš©, 즉시 해당 ìž¥ì¹˜ì— ìžë£Œë¥¼ 기ë¡í•  수 있다.
ï½ Write
Write 시스템 í˜¸ì¶œì€ ë²„í¼ bufì— ìžˆëŠ” ì²˜ìŒ nbytes ê°œì˜ ë°”ì´íŠ¸ë“¤ì„
íŒŒì¼ ì„œìˆ ìž fildesì— ì—°ê´€ëœ íŒŒì¼ì— 기ë¡í•˜ê³ , 실제로 기ë¡í•œ ë°”ì´íŠ¸ 수를 ëŒ
려준다.
시스템 í˜¸ì¶œì˜ êµ¬ë¬¸
#include <unistd.h>
Size_t write(int fildes, const void* buf, size_t nbytes);
ï½ Read
Read 시스템 í˜¸ì¶œì€ íŒŒì¼ ì„œìˆ ìž fildesì— ì—°ê´€ëœ íŒŒì¼ë¡œë¶€í„° nbytesê°œì˜ ë°”
ì´íŠ¸ë“¤ì„ ì½ì–´ì„œ ê·¸ ë°”ì´íŠ¸ë“¤ì„ ë²„í¼ bufì— ì§‘ì–´ë„£ëŠ”ë‹¤.
ë°˜í™˜ê°’ì€ ì‹¤ì œë¡œ ì½ì€ ë°”ì´íŠ¸ 개수ì¸ë°, 요청한 ë°”ì´íŠ¸ 수보다 ìž‘ì„ ìˆ˜ë„ ìžˆë‹¤.
ë°˜í™˜ê°’ì´ 0ì´ë©´ 아무 ê²ƒë„ ì½ì§€ ì•Šì€ ê²ƒì´ë‹¤(파ì¼ì˜ ëì— ë„달한 경우).
-1 ì€ ì˜¤ë¥˜ë¥¼ ì˜ë¯¸
#include <unistd.h>
Size_t read(int fildes, void *buf,size_t nbytes);
ï½ Open
새 íŒŒì¼ ì„œìˆ ìžë¥¼ 만들기 위해서는 open 시스템 í˜¸ì¶œì„ ì‚¬ìš©í•´ì•¼ 한다.
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
Int open(const char* path, int oflags);
Int open(const char* path, int oflags, mode_t mode);
간단히 ë§í•˜ìžë©´ openì€ íŒŒì¼ ë˜ëŠ” ìž¥ì¹˜ë¡œì˜ ì ‘ê·¼ 경로를 만듬.
Flagê°’ì„ í†µí•´ 모드 설정, O_RDONLY, O_WRONLY, O_RDWR
ê°ê° ì½ê¸°, 쓰기, ì½ê¸° 쓰기 가능하게 하는 모드.
(ì´ë“¤ 중 하나를 반드시 지정해야 한다.)
(다른 플래그 ê°’ì´ ìžˆì§€ë§Œ ìƒì„¸í•œ ë¶€ë¶„ì€ ìƒëžµí•œë‹¤.)
ï½ ì´ˆê¸° 권한
그림ì—ì„œ 보듯ì´, drwxrwxr-x :디렉토리, 사용ìž,그룹,다른 사용ìž
Rì€ ì½ê¸°ê¶Œí•œ, w는 쓰기, x는 실행 ì´ë‹¤.
ì´ í›„ì— close 함수, ioctl 함수가 ìžˆëŠ”ë° close는 íŒŒì¼ ì„œìˆ ìžì™€ 파ì¼ì˜ ì—°ê´€
ì„ ëŠëŠ” 함수, ioctl함수는 íŒŒì¼ ì„œìˆ ìž(fildes)ê°€ 가리키는 대ìƒì— 대해
cmdë¡œ ì§€ì •ëœ ê¸°ëŠ¥ì„ ìˆ˜í–‰í•œë‹¤.
ï½ ë‚˜ë¨¸ì§€ íŒŒì¼ ê´€ë¦¬ 관련 시스템 호출들
-lseek : íŒŒì¼ ì„œìˆ ìž(fildes)ê°€ 가리키는 파ì¼ì˜ ì½ê¸°/쓰기 í¬ì¸í„° 설정한다.
-fstat,stat,lstat : 파ì¼ì„œìˆ ìžì— ì—°ê´€ëœ íŒŒì¼ì˜ ìƒíƒœ 정보를 ëŒë ¤ì¤€ë‹¤.
-dup, dup2 : íŒŒì¼ ì„œìˆ ìžë¥¼ 복제하는 ë° ì“°ì¸ë‹¤.
ì´ í˜¸ì¶œë“¤ì— ëŒ€í•œ 변수나 ìžì„¸í•œ ì‚¬í•­ì€ ì°¸ì¡°í•˜ì—¬ 사용한다.
ï½ í‘œì¤€ I/O ë¼ì´ë¸ŒëŸ¬ë¦¬
->표준 I/O ë¼ì´ë¸ŒëŸ¬ë¦¬ì™€ 해당 í—¤ë” íŒŒì¼ì€ 저수준 I/O 시스템 í˜¸ì¶œë“¤ì— ëŒ€í•œ 융통성
있는 ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ 제공한다. ì•„ëž˜ì— ì„¤ëª…í•  ë¶€ë¶„ì€ ì €ìˆ˜ì¤€ 시스템 호출ì´ë‹¤.
-fopen : ì´ í•¨ìˆ˜ëŠ” 주로 파ì¼ê³¼ 터미ë„ì˜ ìž….ì¶œë ¥ì— ì“°ì¸ë‹¤. ìž¥ì¹˜ë“¤ì„ ì¢€ ë” ëª…ì‹œì ìœ¼
ë¡œ 제어하려면 저수준 시스템 í˜¸ì¶œì„ ì‚¬ìš©í•˜ëŠ” ê²ƒì´ ì¢‹ë‹¤.
-fread : íŒŒì¼ ìŠ¤íŠ¸ë¦¼ìœ¼ë¡œë¶€í„° ìžë£Œë¥¼ ì½ëŠ”ë° ì“°ì¸ë‹¤. ì½ì€ ìžë£ŒëŠ” ptrì´ ê°€ë¦¬í‚¤ëŠ” ìžë£Œ
버í¼ì— 기ë¡ëœë‹¤.fread, fwrite ëª¨ë‘ ìžë£Œë¥¼ 레코드 단위로 처리한다.
-fclose : 스트림 매개변수로 ì§€ì •ëœ ìŠ¤íŠ¸ë¦¼ì„ ë‹«ëŠ”ë‹¤. ì´ë•Œ ì•„ì§ ê¸°ë¡ë˜ì§€ ì•Šì€ ìžë£Œê°€
ëª¨ë‘ ê¸°ë¡ëœë‹¤.명시ì ìœ¼ë¡œ 사용해주면 좋다.
-fwrite : ì¸í„°íŽ˜ì´ìŠ¤ëŠ” fread와 비슷하다. 출력 ìŠ¤íŠ¸ë¦¼ì— ê¸°ë¡, 성공ì ìœ¼ë¡œ 기ë¡í•œ 레코
ë“œ 개수를 ëŒë ¤ì¤€ë‹¤.
-fflush : 주어진 íŒŒì¼ ìŠ¤íŠ¸ë¦¼ì— ëŒ€í•´ 대기 ì¤‘ì¸ ëª¨ë“  ìžë£Œë¥¼ 즉시 기ë¡í•œë‹¤.
예) ëŒ€í™”ì‹ í”„ë¡¬í”„íŠ¸ê°€ 확실히 터미ë„ì— ì¶œë ¥ëœ í›„ì—만 사용ìžì˜ ìž…ë ¥ì„ ë°›ì•„ 들여야하
는 ê²½ìš°ì— ìœ ìš©.fclose 호출하는 ì‹œì ì—서는 fflush를 êµ³ì´ í˜¸ì¶œí•  필요가 없다.
*í—¤ë”파ì¼ì€ stdio.h ì´ë‹¤.
ï½ í‘œì¤€ I/O ë¼ì´ë¸ŒëŸ¬ë¦¬
-fseek : 시스템 호출 lseekì— í•´ë‹¹. ì´ í•¨ìˆ˜ëŠ” 스트림ì—ì„œ 다ìŒë²ˆì— ìžë£Œë¥¼ ì½ê±°ë‚˜
쓸 위치를 설정한다. ì°¨ì´ì ì€ lseekì€ off_t, fseekì€ ì„±ê³µì‹œ 0, 실패시 -1 반환한다.
-fget, getc, getchar : íŒŒì¼ ìŠ¤íŠ¸ë¦¼ì—ì„œ ë‹¤ìŒ ë°”ì´íŠ¸(문ìž)를 ëŒë ¤ì¤€ë‹¤. 파ì¼ì˜ ëì—
ë„달했거나 오류가 있다면 EOF를 ëŒë ¤ì¤€ë‹¤.
-fputc, putc, putchar : fputc는 ë¬¸ìž í•˜ë‚˜ë¥¼ 출력 ìŠ¤íŠ¸ë¦¼ì— ê¸°ë¡í•œë‹¤. 성공 ì‹œ 문ìžì˜
ê°’ì„ ëŒë ¤ì£¼ê³ , 실패 ì‹œ EOF를 ëŒë ¤ì¤€ë‹¤.
-fgets, gets : ìž…ë ¥ íŒŒì¼ ìŠ¤íŠ¸ë¦¼ì—ì„œ í•˜ë‚˜ì˜ ë¬¸ìžì—´ì„ ì½ì–´ 들ì¸ë‹¤.
Ex) char* fgets(char* s, int n, FILE* stream);
char* gets(char* s);
->sê°€ 가리키는 문ìžì—´ì— ë„£ë˜ ìƒˆ 줄 문ìžë¥¼ 만나거나, n-1ê°œì˜ ë¬¸ìžë“¤ì„ ì½ì—ˆê±°ë‚˜, 파
ì¼ì˜ ëì— ë„달하면 멈춘다. 새 줄 문ìžë„ sì— ì €ìž¥ëœë‹¤.
*EOF는 End Of Fileì˜ ì•½ìž
ï½ ì„œì‹í™”ëœ ìž…ë ¥ê³¼ 출력
-printf, fprintf, sprintf : 서로 다른 형ì‹ì˜ 여러 ì¸ìˆ˜ë“¤ì„ ì„œì‹í™”í•´ì„œ 출력한다.
-scanf, fscanf, sscanf : 스트림으로부터 ê°’ë“¤ì„ ì½ê³  ê·¸ê²ƒë“¤ì„ í¬ì¸í„° 매개변수들ì´
가리키는 ë³€ìˆ˜ë“¤ì— ì§‘ì–´ë„£ëŠ”ë‹¤.
-기타 다른 í•¨ìˆ˜ë“¤ë„ ë§Žì§€ë§Œ (표준 스트림 stdin, stdout,stderr ì„ ì‚¬ìš©í•˜ëŠ” 함수들)
íŒŒì¼ ìŠ¤íŠ¸ë¦¼ì— ëŒ€í•œ 설정ì´ë‚˜ 위치설정 등ì´ë‹¤.
ï½ íŒŒì¼ê³¼ ë””ë ‰í„°ë¦¬ì˜ ìƒì„± ë° ê´€ë¦¬
-파ì¼, ë””ë ‰í„°ë¦¬ì˜ ìƒì„± ë° ê´€ë¦¬ë¥¼ 위한 여러 표준 ë¼ì´ë¸ŒëŸ¬ë¦¬ 함수들과 시스템 호출.
-chmod : 시스템 호출로, 파ì¼ì´ë‚˜ ë””ë ‰í„°ë¦¬ì˜ ì ‘ê·¼ ê¶Œí•œì„ ë³€ê²½í•˜ëŠ” ë° ì“°ì¸ë‹¤.
-chown : 슈í¼ì‚¬ìš©ìžëŠ” ì´ ì‹œìŠ¤í…œ 호출로 파ì¼ì˜ 소유ìžë¥¼ 변경할 수 있다.
-unlink : 파ì¼ì˜ 제거.
-mkdir, rmdir : ë””ë ‰í† ë¦¬ì˜ ìƒì„±, 제거. 권한 ì„¤ì •ì€ umaskì— ì˜ì¡´í•œë‹¤.
-chdir 와 getcwd : 현재 디렉토리 변경 시 chdir 시스템 호출. 현재 디렉토리를 알고
ì‹¶ì„ ë•ŒëŠ” getcwd함수 사용.
-opendir : 디렉터리를 ì—´ê³  ê·¸ì— ëŒ€í•œ 디렉터리 ìŠ¤íŠ¸ë¦¼ì„ ë§Œë“¬. 성공시 디렉터리 항목
ë“¤ì„ ì½ëŠ”ë° ì‚¬ìš©í•  DIR 구조체를 가리키는 í¬ì¸í„°ë¥¼ ëŒë ¤ì¤€ë‹¤.
-readdir : 디렉터리 스트림 ì•ˆì˜ ë‹¤ìŒ ë””ë ‰í„°ë¦¬ í•­ëª©ì— ëŒ€í•œ êµ¬ì¡°ì²´ì˜ í¬ì¸í„°ë¥¼ 반환.
-telldir : ë””ë ‰í„°ë¦¬ì˜ ìŠ¤íŠ¸ë¦¼ì˜ í˜„ìž¬ ìœ„ì¹˜ì— í•´ë‹¹í•˜ëŠ” ê°’ì„ ëŒë ¤ì¤€ë‹¤.
-seekdir : 주어진 디렉터리 ìŠ¤íŠ¸ë¦¼ì˜ í˜„ìž¬ 디렉터리 항목 위치를 변경한다.
-closedir : 디렉터리 ìŠ¤íŠ¸ë¦¼ì„ ë‹«ê³  ê·¸ì— ì—°ê´€ëœ ìžì›ë“¤ì„ 해제한다. 성공 ì‹œ 0 반환.
ï½ ì˜¤ë¥˜ì²˜ë¦¬
-strerror : 주어진 오류 ë²ˆí˜¸ì— í•´ë‹¹í•˜ëŠ” 오류 메시지 문ìžì—´ì„ 반환한다.
-perror : 오류 번호를 ì§ì ‘ 받는 대신 현재 errnoì— ì„¤ì •ëœ ê°’ì„ ì‚¬ìš©.
ï½ /PROC íŒŒì¼ ì‹œìŠ¤í…œ
->ì´ íŒŒì¼ ì‹œìŠ¤í…œì´ ì œê³µí•˜ëŠ” ê²ƒì€ ë“œë¼ì´ë²„들과 ì»¤ë„ ê¸°ëŠ¥.
ï½ Fcntl ê³¼ mmap
->fcntlì€ ì €ìˆ˜ì¤€ íŒŒì¼ ì„œìˆ ìžë¥¼ 통해 파ì¼ì„ 좀 ë” ì„¸ë°€í•˜ê²Œ 제어.
->mmap 둘 ì´ìƒì˜ í”„ë¡œê·¸ëž¨ë“¤ì´ ì½ê±°ë‚˜ 쓸 수 있는 메모리 ì˜ì—­ì„ 설정.
ï½ í”„ë¡œì„¸ìŠ¤ì™€ 신호ì—ì„œ 다루게 ë  ë¶€ë¶„
â—¦ 프로세스 구조, 종류, ì¼ì •
◦ 새 프로세스를 시작하는 여러 가지 방법들
â—¦ 부모, ìžì‹, 좀비 프로세스
◦ 신호와 그 활용 방법
ï½ í”„ë¡œì„¸ìŠ¤ëž€â€¦?
â—¦ “하나 ì´ìƒì˜ 스레드들과 ê·¸ ìŠ¤ë ˆë“œë“¤ì— í•„ìš”í•œ 시스템
ìžì›ë“¤ì„ í¬í•¨í•˜ëŠ” í•˜ë‚˜ì˜ ì£¼ì†Œ 공간â€ìœ¼ë¡œ ì •ì˜í•œë‹¤.
â—¦ 프로세스를 현재 실행 ì¤‘ì¸ í•˜ë‚˜ì˜ í”„ë¡œê·¸ëž¨ìœ¼ë¡œ 간주.
ï½ í”„ë¡œì„¸ìŠ¤ 구조, 종류, ì¼ì •(스케줄ë§)
PID 101
CODE
ìžë£Œ
ë¼ì´ë¸ŒëŸ¬ë¦¬
파ì¼ë“¤
PID 102
CODE
ìžë£Œ
ë¼ì´ë¸ŒëŸ¬ë¦¬
파ì¼ë“¤
code
Cë¼ì´ë¸ŒëŸ¬ë¦¬
Treck.txt nene.txt
$ grep ìžë£Œ treck.txt $ grep ìžë£Œ nene.txt
ï½ í”„ë¡œì„¸ìŠ¤ 보기
í”„ë¡œì„¸ìŠ¤ì˜ ìƒíƒœ
현재 ì‹¤í–‰ì¤‘ì¸ í”„ë¡œì„¸ìŠ¤
ï½ ìƒˆ 프로세스 시작
â—¦ System 함수를 ì´ìš©í•œ í”„ë¡œì„¸ìŠ¤ì˜ ì‹œìž‘. 여기선 clear 명령어를 사용했다.
ï½ í”„ë¡œì„¸ìŠ¤ ì´ë¯¸ì§€ 대체하기
â—¦ Exec 함수를 ì´ìš©, 새 프로세스를 ë„우지만 프로세스를 ë„우는 ë°©ì‹ì´ë‚˜
프로그램 ì¸ìˆ˜ë“¤ì„ 제공하는 ë°©ì‹ì€ 서로 다르다.
ï‚– System 함수보다 훨씬 íš¨ìœ¨ì  -> 새 í”„ë¡œê·¸ëž¨ì´ ì‹œìž‘ëœ í›„ì—는 ì›ëž˜ì˜ 프로그
ëž¨ì´ ë” ì´ìƒ ì‹¤í–‰ë  í•„ìš”ê°€ 없다는 ì ì—ì„œ system 함수보다 훨씬 효율ì .
 예) execl(const char* path, const char* arg0, … ,(char*)0);
Execlp를 ì´ìš©í•œ ps ax 실행.
ï½ í”„ë¡œì„¸ìŠ¤ì˜ ì´ë¯¸ì§€ 복제(fork)
â—¦ ë™ì‹œì— 여러 ê¸°ëŠ¥ì„ ìˆ˜í–‰í•˜ê³ ìž í•  ë•Œì—는 ì œ 12장ì—ì„œ 다루는 스
레드를 사용할 ìˆ˜ë„ ìžˆê³ , initì´ í•˜ëŠ” 것처럼 í•œ 프로그램 안ì—ì„œ
완전히 개별ì ì¸ 프로세스를 ìƒì„± í•  ìˆ˜ë„ ìžˆë‹¤.
초기 프로세스
Fork()
ì›ëž˜ 프로세스
ì˜ ì‹¤í–‰
새 프로세스
0ì„ ë¦¬í„´
새 PID 리턴
ï½ Forkí•¨ìˆ˜ì˜ ì±…ì—ì„œì˜ ê°„ë‹¨í•œ 예제
ì¤‘ê°„ì— ëª…ë ¹í”„ë¡¬í”„íŠ¸ê°€ 껴있는ë°
ê·¸ ì´ìœ ëŠ” ìžì‹ 프로세스는 여전히 실행 중,
부모프로세스는 ëë‚œ ì´ìœ ì´ë‹¤.
ï½ ì¢€ë¹„ 프로세스
â—¦ Fork를 ì´ìš©í•œ 프로세스 ìƒì„±ì€ 유용하나, ì‹¤í–‰ì´ ì¢…ë£Œë˜ì—ˆìœ¼ë‚˜ 부모와
ì˜ ì—°ê´€ê´€ê³„ê°€ ì•„ì§ ë‚¨ì•„ 있는 프로세스를 가리켜서 소멸ëœ(defunct)프
로세스, 좀비 프로세스ë¼ê³  부른다.
실행 ì‹œ ë’¤ì— & 붙여서 백그ë¼ìš´ë“œ ìž‘ì—… 후
부모 프로세스 ë나기 ì „ì— ps 명령어를 실행시켜보면,
<defunct> ë¼ê³  나오며, ì´ê²ƒì´ 좀비 프로세스ì´ë‹¤.
ï½ ì“°ë ˆë“œ
â—¦ 리눅스ì—ì„œ 프로세스보다 ìž‘ì€ ì‹¤í–‰ 단위로 스레드ë¼ëŠ” ê²ƒì´ ìžˆë‹¤.
추후 ch12 ì—ì„œ 다룸.
ï½ ì‹ í˜¸(signal)
â—¦ 신호는 유닉스와 리눅스 ì‹œìŠ¤í…œì´ ì–´ë–¤ ì¡°ê±´ì— ë”°ë¼ ë°œìƒì‹œí‚¤ëŠ” 사건ì´
다.(event)
â—¦ Signalì„ ì´ìš©í•´ì„œ 프로세스를 관리한다.
â—¦ ë§Žì€ í•¨ìˆ˜ì™€ 플래그 ê°’ì´ ìžˆì§€ë§Œ ë‚˜ì¤‘ì— ì‚¬ìš©ì‹œ ë ˆí¼ëŸ°ìŠ¤ 하는 ê²ƒì´ ì¢‹ì„
ê±°ë¼ ìƒê°ë¨.
â—¦ 몇 가지 예만 설명하고 ë‹¤ìŒ ìž¥ìœ¼ë¡œ.
ï½ Signal
â—¦ í—¤ë” íŒŒì¼ì€ <signal.h>
â—¦ Signal함수, sigaction 함수가 ìžˆëŠ”ë° ë‘˜ 중 sigaction 함수가 ë” íš¨ìœ¨ì„±
ì´ ì¢‹ìŒ.(안정성, ì‹ íšŒì„±ì´ ë” ì¢‹ìŒ. )
â—¦ ìžì£¼ ì“°ì´ëŠ” 신호
ï‚– SIGALRM – alarm 함수로 ì„¤ì •ëœ íƒ€ì´ë¨¸ì— ì˜í•´ ë°œìƒ
ï‚– SIGHUP – ì—°ê²° ëŠê¸´ 터미ë„ì´ ì œì–´ 프로세스ì—게 보냄
ï‚– SIGINT – ctrl + c ë˜ëŠ” ê·¸ì— í•´ë‹¹í•˜ëŠ” 가로채기 문ìžê°€ ìž…ë ¥ ë¬ì„ ë•Œ
ï‚– SIGKILL – 프로세스를 ê°•ì œ ì¢…ë£Œí•˜ê³ ìž í•  ë•Œ.
ï‚– SIGPIPE – ì—°ê´€ëœ íŒë…ìžê°€ 없는 파ì´í”„ì— ì“°ê¸° ì‹œë„ ì‹œ ë°œìƒ.
ï‚– SIGTERM – killëª…ë ¹ì´ ë³´ë‚´ëŠ” 기본 신호
ï‚– SIGUSR1, SIGUSER2 – í”„ë¡œì„¸ìŠ¤ë“¤ì´ ì„œë¡œ 소통하는 ë° ì“°ìž„
 SIGCONT – 실행 재개
ï‚– SIGCHLD – ìžì‹ í”„ë¡œì„¸ìŠ¤ì˜ ì¤‘ì§€, 종료 ì‹œ ë°œìƒ.
ï½ ì“°ë ˆë“œëž€?
â—¦ í•œ í”„ë¡œê·¸ëž¨ì˜ ì—¬ëŸ¬ ê°œì˜ ì‹¤í–‰ ê°€ë‹¥ë“¤ì„ ê°€ë¦¬ì¼œ 쓰레드(thread)ë¼ê³  부른다.
â—¦ 좀 ë” ì •í™•í•˜ê²Œ ë§í•˜ìžë©´ 쓰레드란, 프로세스 ì•ˆì˜ í•˜ë‚˜ì˜ ì œì–´ íë¦„ì„ ì˜ë¯¸í•œë‹¤.
â—¦ ì“°ë ˆë“œì˜ ìž¥,단ì 
ï‚– 장ì :
ï‚– -ìžë£Œì²˜ë¦¬ëŸ‰ì˜ ì¦ëŒ€, 여러 가지 ì¼ì˜ ë™ì‹œ 처리를 통해 효율성ì¦ê°€
ï‚– -성능 í–¥ìƒ
ï‚– -ìžì›ì˜ 효율성 ì¦ê°€.
ï‚– 단ì :
ï‚– -다중 쓰레드 í”„ë¡œê·¸ëž¨ì˜ êµ¬í˜„ì´ ë‚œì´ë„ê°€ 높ìŒ
ï‚– -ë””ë²„ê¹…ì´ ì–´ë µë‹¤.
ï‚– -다중처리 지ì›í•˜ëŠ” 다중 코어 컴퓨터ì´ì–´ì•¼ 함.
ï‚– 다중 쓰레드 í”„ë¡œê·¸ëž¨ì˜ ì˜ˆ) 문서를 편집하는 ë™ì•ˆ 실시간으로 ë¬¸ìž ìˆ˜ 세는 것.
ï½ ì²« 번째 다중 쓰레드 프로그램
ï½ ì“°ë ˆë“œê°€ 실행할 함수
ï½ -pthread_createì˜ ìš”êµ¬ì— ë”°ë¼, ì´ í•¨ìˆ˜ëŠ” void í¬ì¸í„° 하나를 받고 void
í¬ì¸í„°ë¥¼ ëŒë ¤ì¤€ë‹¤.
ï½ í—¤ë”íŒŒì¼ <pthread.h>
ï½ Int pthread_create(pthread_t* thread, pthread_attr_t* attr, void
*(*start_routine)(void*), void* arg);
1.pthread_t 를 가리키는 í¬ì¸í„°, 2. ì“°ë ˆë“œì˜ íŠ¹ì„±,
3. Void를 가리키는 í¬ì¸í„°ë¥¼ 받고 void를 가리키는 í¬ì¸í„°ë¥¼ ëŒë ¤ì£¼ëŠ” í•¨ìˆ˜ì˜ ì£¼ì†Œ 지정
ï½ Main 함수
Res!=0 ì¼ ë•ŒëŠ” threadê°€ ìƒì„±ì´ 실패한 것 = exit, 성공 ì‹œ ë‹¤ìŒ printf를 실행.
Res ==0 ì¼ ê²½ìš° res = pthread_join(a_thread, &thread_result); 실행.
ï½ ë™ê¸°í™”
ï½ ë‘ ì“°ë ˆë“œ ì´ìƒì´ ë™ì‹œì— ì‹¤í–‰ë  ë•Œ, 쓰레드 ì‹¤í–‰ì„ ì œì–´í•˜ê³  ì½”ë“œì˜ ìž„ê³„ì˜ì—­ì— ì ‘
근하기 위한, 즉 좀 ë” ë‚˜ì€ ì“°ë ˆë“œ ì‹¤í–‰ì„ ì œì–´, ì½”ë“œì˜ ìž„ê³„ì˜ì—­ì— 접근하기 위한,
즉 좀 ë” ë‚˜ì€ ì“°ë ˆë“œ 실행 ë™ê¸°í™”를 위한 ì¼ë‹¨ì˜ í•¨ìˆ˜ë“¤ì´ ì¡´ìž¬í•œë‹¤.
ï½ -세마í¬ì–´(Semaphore) : 코드ì˜ì—­ ì „í›„ì˜ ê´€ë¬¸ ì—­í• ì„ í•œë‹¤.
ï½ -뮤í…스(Mutex) : 코드ì˜ì—­ì„ 보호하기 위한 ìƒí˜¸ ë°°ì œ 수단(Mutual exclusion)으로
ì“°ìž„.
ï½ â€»ì„¸ë§ˆí¬ì–´ëŠ” 여러 ê°œì˜ ì“°ë ˆë“œë¥¼ ë™ê¸°í™” í•  ë•Œ 사용하기 좋으며, 뮤í…스는 하나 하나
ì˜ ë™ê¸°í™”를 í•  ë•Œ 좋다.
ï½ ê°„ë‹¨í•œ 예제
ï½ ì“°ë ˆë“œê°€ 실행할 함수부분.
ï½ ê¸€ìž ìˆ˜ë¥¼ 세서 출력하는 함수.
ï½ ì„¸ë§ˆí¬ì–´ë¥¼ 기다린 후 ìž…ë ¥ëœ ë¬¸ìžë“¤ì˜ 개수를 ì…ˆ.
세마í¬ì–´ 초기화.(0으로)
ï½ End ë¬¸ìž ìž…ë ¥ ì‹œ 종료, FASTìž…ë ¥ ì‹œ Wheee… 출력.
End ìž…ë ¥ ì‹œ 쓰레드 종료, 세마í¬ì–´ í•´ì œ. 종료.
ï½ ì‹¤í–‰í™”ë©´.
ï½ ë®¤í…스(Mutex)를 ì´ìš©í•œ ë™ê¸°í™”
ï½ ë®¤í…스(Mutex)는 ì¼ì •í•œ 코드 ì˜ì—­ì´ í•œ ë²ˆì— í•˜ë‚˜ì˜ ìŠ¤ë ˆë“œì— ì˜í•´ì„œë§Œ ì‹¤í–‰ë  ìˆ˜
있ë„ë¡ ê·¸ ì˜ì—­ì„ â€œìž ê·¸ëŠ”â€ ì—­í• ì„ í•œë‹¤.(코드 ì˜ì—­ == 임계ì˜ì—­)
ï½ í•´ë‹¹ì˜ì—­ì˜ ë™ì‹œì ‘ê·¼ì„ ë§‰ëŠ”ë‹¤.
ï½ #include <pthread.h>
Int pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t*
Mutexattr); - 뮤í…ìŠ¤ì˜ ì´ˆê¸°í™”
Int pthread_mutex_lock(pthread_mutex_t* mutex); - 뮤í…스 잠금
Int pthread_mutex_unlock(pthread_mutex_t* mutex); - 뮤í…스 í•´ì œ
Int pthread_mutex_destroy(pthread_mutex_t* mutex); - 뮤í…스 ì‚­ì œ
*ë™ê¸°í™”ì— ëŒ€í•œ ë¶€ë¶„ì€ ì„¸ë§ˆí¬ì–´ì™€ 뮤í…스를 통한 ê¸°ë²•ì´ ìžˆë‹¤ ì •ë„만 있으면 ëœë‹¤.
*ì°¨í›„ì— í”„ë¡œê·¸ëž˜ë° ì‹œ ì ìš©í•  때는 ê° í•¨ìˆ˜ë¥¼ ë ˆí¼ëŸ°ìŠ¤í•˜ì—¬ 사용.
ï½ ì“°ë ˆë“œì˜ íŠ¹ì„±
ï½ ì“°ë ˆë“œì˜ íŠ¹ì„±(attribute)
â—¦ 가장 중요한 함수는 쓰레드 특성 ê°ì²´ë¥¼ 초기화하는 pthread_attr_init ì´ë‹¤.
ì´ í•¨ìˆ˜ëŠ” 성공 ì‹œ 0ì„, 실패 ì‹œ -1ì„ ë°˜í™˜í•œë‹¤.
ï½ ì“°ë ˆë“œì˜ íŠ¹ì„±ë“¤
â—¦ Detachedstate : ì´ íŠ¹ì„±ì€ ì“°ë ˆë“œì˜ ìž¬ê²°í•© 가능 여부를 결정한다.
â—¦ Schedpolicy : ì“°ë ˆë“œì˜ ì¼ì • 관리 ë°©ì‹ì„ 결정한다.(scheduling)
â—¦ Schedparam : schedpolicy ì— ì¶”ê°€ì ì¸ 정보를 제공한다.
â—¦ Inheritsched : ì“°ë ˆë“œì˜ ìŠ¤ì¼€ì¤„ë§ ë°©ì‹ì— 대해 설명한다.(해당특성 or 쓰레드를 만든 ì“°ë ˆë“œì˜ ë°©ì‹)
â—¦ Scope : ì“°ë ˆë“œì˜ ìŠ¤ì¼€ì¤„ë§ì„ 계산하는 ë°©ì‹ì„ ê²°ì •.(리눅스는 PTHREAD_SCOPE_SYSTEM만 지ì›)
â—¦ Stacksize : 쓰레드 ìƒì„± ìŠ¤íƒ í¬ê¸° ê²°ì •.
ï½ ì“°ë ˆë“œì˜ ì·¨ì†Œ
â—¦ í•œ 프로세스가 다른 프로세스ì—게 신호를 ë³´ë‚´ì„œ 종료를 요청하듯, í•œ 쓰레드가 다른 쓰레드ì—
게 실행종료를 요청해야 하는 경우가 있다. ì´ ë•Œ ì“°ì´ëŠ” 함수는
int pthread_cancel(pthread_t thread); // 유ì¼í•œ ì¸ìˆ˜ëŠ” ì“°ë ˆë“œì˜ ì‹ë³„ìžì´ë‹¤.
ê·¸ì „ì— ì·¨ì†Œ ìƒíƒœë¥¼ 결정해야 í•˜ëŠ”ë° ê·¸ 함수는
Int pthread_setcancelstate(int state, int* oldstate);
*ìžì„¸í•œ ìƒí•­ì€ ë”°ë¡œ 참조해서 ë³´ëŠ”ê²ƒì´ ì¢‹ë‹¤.
ï½ ë‘ ê°œ ì´ìƒì˜ 쓰레드
ï½ ì—¬ëŸ¬ ê°œì˜ ìƒˆ ì“°ë ˆë“œë“¤ì„ ìƒì„±í•´ì„œ ë™ì‹œì— 실행하는 예
ì´ í”„ë¡œê·¸ëž¨ì„ ì‹¤í–‰ì‹œí‚¤ë©´ 나오는 화면ì€â€¦
ï½ ì‹¤í–‰í™”ë©´
*ì±…ì—서는 ‘sleep함수를 없애고 í•´ë³´ë©´
ì¼ë¶€ ì“°ë ˆë“œë“¤ì´ ê°™ì€ ì¸ìˆ˜ë“¤ë¡œ 시작ë˜ëŠ”
ì´ìƒí•œ 현ìƒì´ 빚어진다’ 나온다.
ì´ì— 대한 문제는 쓰레드가 빠르게 실행ë˜ëŠ” 경우
ì¼ë¶€ 쓰레드는 ìƒˆë¡œì´ ê°±ì‹ ëœ ì§€ì—­ë³€ìˆ˜ì˜ ê°’ì„ ë°›ê²Œ
ë˜ê³ , 그래서 ê°™ì€ ë²ˆí˜¸ë¥¼ 가진 쓰레드가 ìƒê¸°ëŠ” 것.
->주소 값으로 받지ë§ê³  ë³€ìˆ˜ì˜ ê°’ì„ ìŠ¤ë ˆë“œ 함수ì—
전달해야 한다.
ï½ ìš”ì•½
â—¦ ì´ë²ˆìž¥ì—서만 ìš”ì•½ì„ ì“°ëŠ” ì´ìœ ëŠ” ê·¸ë§Œí¼ ì“°ë ˆë“œê°€ 중요해서ì´ë‹¤.
â—¦ 쓰레드는 í”„ë¡œì„¸ìŠ¤ì˜ ë‹¨ì ì„ 보완해줄 수 있으며, 여러방면ì—ì„œ 유용하다. 하지만 구현ì´
어렵다는게 단ì ì´ë©°, 멀티 프로세스ì—ì„œì˜ ë¬¸ì œì ì¸ ë™ì‹œ 실행 문제나 ë™ì‹œ ì ‘ê·¼ì˜ ë¬¸ì œë¥¼ 가지
고 있다.
윈ë„우즈 시스템 프로그래ë°ì—서와 비슷하지만 함수관련하여 변수나 다른 부분만 다르지
ê°œë…ì€ ê°™ë‹¤.
ì±…ì—ì„œì˜ ì„¤ëª…ì€,
í•œ 프로세스 안ì—ì„œ 여러 ê°œì˜ ì“°ë ˆë“œë“¤ì„ ìƒì„±í•˜ëŠ” ë°©ë²•ì— ëŒ€í•´ì„œ 살펴 보았고, 그러한 쓰레드
ë“¤ì€ íŒŒì¼ ë²”ìœ„ ë³€ìˆ˜ë“¤ì„ í•¨ê»˜ 공유한다. ë˜ ê·¸ 공유하는 ë¶€ë¶„ì— ëŒ€í•´ì„œ 세마í¬ì™€ 뮤í…스를 ì´
ìš©, 임계ì˜ì—­ì´ë‚˜ ìžë£Œì— 대한 ì“°ë ˆë“œì˜ ì ‘ê·¼ì„ ì œì–´í•˜ëŠ” ê²ƒë„ ë³´ì•˜ë‹¤.
ï½ IPC : InterProcesscommunicationë¡œ 프로세스간 통신
ì„ ì˜ë¯¸í•˜ë©° ê·¸ 중 파ì´í”„ê°€ 있다.
ï½ íŒŒì´í”„(Pipe) : ë‘ í”„ë¡œì„¸ìŠ¤ 사ì´ì˜ ìžë£Œ í름 통로를 제공 하는 수단.
ì¼ë°˜ì ìœ¼ë¡œ 파ì´í”„는 í•œ í”„ë¡œì„¸ìŠ¤ì˜ ì¶œë ¥ì„ ë‹¤ë¥¸ í”„ë¡œì„¸ìŠ¤ì˜ ìž…ë ¥ì—
연결하는 ìš©ë„ë¡œ ì“°ì¸ë‹¤.
-popen, pclose – ë‘ í”„ë¡œê·¸ëž¨ì´ ìžë£Œë¥¼ 주고 받는 가장 간단한 ë°©ë²•ì˜ í•¨ìˆ˜.
-pipe 함수 : ìœ„ì˜ popen, pclose 보다 ì €ìˆ˜ì¤€ì˜ í•¨ìˆ˜ë¡œ pipe를 사용 ì‹œ
fread 나 fwrite ê°™ì€ í•¨ìˆ˜ë“¤ì´ ì•„ë‹ˆë¼ read, write ê°™ì€ ì €ìˆ˜ì¤€ 시스템 호
ì¶œë“¤ì„ ì‚¬ìš©í•´ì•¼ 한다.
*pipe는 나중ì—… 중요ë„ê°€ í¬ì§€ 않으므로…
ï½ ëª…ëª…ëœ íŒŒì´í”„ :FIFO
â—¦ Named pipe(ëª…ëª…ëœ íŒŒì´í”„, ì´ë¦„있는 파ì´í”„)
â—¦ ìžì‹í”„로세스와 부모프로세스 ê´€ê³„ì˜ íŒŒì¼, ë°ì´í„° 주고 받는 것과 달리, 서로 ì—°ê´€ë˜ì§€ ì•Šì€
프로세스들ë¼ë¦¬ ìžë£Œë¥¼ 주고 ë°›ì„ ìˆ˜ 있게 하는 파ì´í”„
ì±…ì—ì„œ 서버 & í´ë¼ì´ì–¸íŠ¸ì™€ì˜ ì—°ê²°ì„ FIFOë¡œ 구현하였으며
ë°ì´í„°ë² ì´ìŠ¤ì™€ì˜ ì—°ê²° ë˜í•œ FIFOë¡œ êµ¬í˜„í–ˆëŠ”ë° í›„ì— ì†Œì¼“ìœ¼ë¡œ 구현하는
ë°©ë²•ì´ ë§Žì´ ì‚¬ìš©ë˜ë‹ˆ í›„ì— ì†Œì¼“ì„ ìžì„¸ížˆ 공부하기로 했다.
ï½ ì„¸ë§ˆí¬(semaphore)란?
â—¦ í•˜ë‚˜ì˜ ìžì›ì— 단 í•˜ë‚˜ì˜ í”„ë¡œì„¸ìŠ¤(ë˜ëŠ” 프로세스)ë§Œì´ ì ‘ê·¼í•¨ì„ ë³´ìž¥í•´ì•¼ 하는
코드 ì˜ì—­ì´ 있는ë°, 그런 ì˜ì—­ì„ 임계 ì˜ì—­(critical section)ì´ë¼ê³  부른다.
여러 í”„ë¡œê·¸ëž¨ë“¤ì´ í•˜ë‚˜ì˜ ê³µìœ  ìžì›ì— ë™ì‹œì— 접근할 ë•Œ ë°œìƒí•˜ëŠ” 문제를 방지하
려면 í•œ ë²ˆì— ë‹¨ í•˜ë‚˜ì˜ ì‹¤í–‰ 쓰레드만 í•˜ë‚˜ì˜ ìž„ê³„ì˜ì—­ì— 접근할 수 있ë„ë¡ ì¼ì¢…
ì˜ í† í°ì„ ìƒì„±, 부여하는 ìˆ˜ë‹¨ì´ í•„ìš”í•˜ë‹¤.
세마í¬ë¥¼ ì´ìš©, 임계 ì˜ì—­ì— 접근하는 ê²ƒì„ í†µì œ, ë™ê¸°í™” 한다.
세마í¬ëŠ” ì˜¤ì§ ëŒ€ê¸°(wait), 신호(signal) ë¼ëŠ” ë‘ ê°€ì§€ ì—°ì‚°ë§Œì´ ê°€ëŠ¥í•œ 특별한 ë³€
수ë¼ê³  í•  수 있다.
ex) 가장 간단한 세마í¬ëŠ” ì´ì§„ 세마í¬ì¸ë° 0, 1 ê°’ ë§Œì„ ê°€ì§„ë‹¤.
ï½ ì„¸ë§ˆí¬ì˜ 사용
â—¦ ì±…ì—서는 semaphore_p, semaphore_v 함수를 만들어서,
semaphore_p는 ì„¸ë§ˆí¬ ê°’ì„ -1 ë§Œí¼ ë³€ê²½í•˜ê²Œ 하며(대기)
semaphore_v는 ì„¸ë§ˆí¬ ê°’ì„ +1 ë§Œí¼ ë³€ê²½í•˜ê²Œ 하여(신호)
임계ì˜ì—­ì— 들어갈 때는 semaphore_p를, 나올 때는 semaphore_v를
호출하여 임계 ì˜ì—­ì— 대한 ì ‘ê·¼ì„ ë™ê¸°í™”한다.
ì´ í•¨ìˆ˜ë“¤ì€ ì¢€ ë” ì¼ë°˜ì ì¸ semop 함수를 단순화한 ì¸í„°íŽ˜ì´ìŠ¤ë‹¤.
세마í¬ë¥¼ 사용한 후ì—는 삭제하는 ê²ƒì´ ì¢‹ì€ë°, í”„ë¡œê·¸ëž¨ì„ ë‹¤ìŒì— 다시
실행할 ë•Œ 문제가 ìƒê¸¸ 수 있기 때문ì´ë‹¤.
ï½ ê³µìœ  메모리(Shared Memory)
â—¦ IPC 수단ì´ë©°, 서로 무관한 ë‘ í”„ë¡œì„¸ìŠ¤ê°€ ë™ì¼í•œ ë…¼ë¦¬ì  ë©”ëª¨ë¦¬ ì˜ì—­ì—
접근할 수 있게 한다. 공유 메모리를 ì´ìš©í•˜ë©´ 실행 ì¤‘ì¸ ë‘ í”„ë¡œì„¸ìŠ¤ê°€
ìžë£Œë¥¼ 아주 효율ì ì¸ ë°©ì‹ìœ¼ë¡œ ì£¼ê³ ë°›ì„ ìˆ˜ 있다.
IPCê°€ í•œ 프로세스를 위해 ìƒì„±í•œ 공유 메모리는 ê·¸ í”„ë¡œì„¸ìŠ¤ì˜ ì£¼ì†Œ 공간ì—ì„œ 특
정 범위를 차지한다.
공유 메모리는 여러 í”„ë¡œì„¸ìŠ¤ë“¤ì´ ìžë£Œë¥¼ 공유하고 주고받는 효율ì ì¸ ìˆ˜ë‹¨ì´ ëœ
다. ì´ ë•Œ, 공유 메모리 ìžì²´ëŠ” ë™ê¸°í™” ìˆ˜ë‹¨ì„ ì œê³µí•˜ì§€ ì•Šì•„ì„œ 해당 í”„ë¡œê·¸ëž¨ì´ ì±…
임져야 한다.
*함수)
-shmget : 공유 메모리 ìƒì„± /변수 : (key_t key,size_t size,int shmflg)
-shmat : í”„ë¡œì„¸ìŠ¤ì˜ ì£¼ì†Œê³µê°„ì— ë¶€ì°©
-shmdt : 공유 메모리를 현재 프로세스ì—ì„œ 떼어낸다.(detach)
-shmctl : 공유 메모리를 제어하는 ìš©ë„(공유메모리 ì‹ë³„ìž, 명령, ê³µìœ ë©”ëª¨ë¦¬ì˜ ëª¨
드들과 ê¶Œí•œë“¤ì„ ë‹´ì€ êµ¬ì¡°ì²´ í¬ì¸í„°)
ï½ ë©”ì‹œì§€ í(Message queue)
â—¦ IPCì˜ í•œ 방법으로 ëª…ëª…ëœ íŒŒì´í”„와 여러모로 비슷한 반면, 파ì´í”„를 ì—´ê³  닫는 ë°
ê´€ë ¨ëœ ë²ˆìž¡í•¨ì´ ì—†ë‹¤. 그러나 꽉 ì°¬ 파ì´í”„ì— ì˜í•œ 실행 차단 등 ëª…ëª…ëœ íŒŒì´í”„ì—
ì„œ ë°œìƒí•  수 있는 ë¬¸ì œë“¤ì€ ë©”ì‹œì§€ íì—ë„ ì—¬ì „ížˆ 존재한다.
메시지 í를 ì´ìš©í•˜ë©´ 서로 무관한 ë‘ í”„ë¡œì„¸ìŠ¤ê°€ ìžë£Œë¥¼ ìƒë‹¹ížˆ 쉽고 효율ì ìœ¼ë¡œ
주고 ë°›ì„ ìˆ˜ 있다. ëª…ëª…ëœ íŒŒì´í”„와 달리 메시지 í는 전송 프로세스와 수신 프로
세스 모ë‘ì— ë…립ì ìœ¼ë¡œ 존재한다. ì´ ë•ë¶„ì— íŒŒì´í”„ì—ì„œ 열기와 닫기를 ë™ê¸°í™”í• 
ë•Œ ìƒê¸°ëŠ” ì–´ë ¤ì›€ì„ í”¼í•  수 있다.
-í•œ 프로세스가 다른 프로세스ì—게 ìžë£Œ 블ë¡ì„ 전달하는 수단.
ê° ìžë£Œ 블ë¡ì´ ìžì‹ ì˜ 종류를 구분하는 ê°’ì„ ê°€ì§€ê³  있어서 수신 프로세스는 서로
다른 ì¢…ë¥˜ì˜ ìžë£Œ 블ë¡ë“¤ì„ ë…립ì ìœ¼ë¡œ ë°›ì„ ìˆ˜ 있고, 처리가 복잡해질 수 있다.
ë˜ íŒŒì´í”„와 마찬가지로 ê° ìžë£Œ 블ë¡ì˜ í¬ê¸°ì—는 ìƒí•œì´ 존재하며, 시스템 ì „ë°˜ì˜
모든 ëŒ€ê¸°ì—´ì— ë‹´ì„ ìˆ˜ 있는 블ë¡ë“¤ì˜ ì „ì²´ í¬ê¸°ì—ë„ ìƒí•œì´ 존재한다.
ï½ ë©”ì‹œì§€ í 함수
â—¦ #include <sys/msg.h>
int msgctl(int msgid, int cmd, struct msgid_ds* buf);
int msgget(key_t key, int msgflg);
int msgrcv(int msgid, void* msg_ptr, size_t msg_sz, long int msgtype, int msgflg);
int msgsnd(int msgid, const void* msg_ptr, size_t msg_sz, int msgflg);
<함수>
Msgget : 메시지 íì— ì ‘ê·¼í•  ë•Œ 사용하는 함수.
Msgsnd : 메시지 íì— í•˜ë‚˜ì˜ ë©”ì‹œì§€ë¥¼ 전송할 ë•Œ 사용하는 함수.
Msgrcv : 메시지 íì—ì„œ 메시지를 ë°›ì„ ë•Œ 사용하는 함수.
Smgctl : 메시지 í를 제어하는 함수.
(공유 ë©”ëª¨ë¦¬ì˜ ì œì–´ 함수와 아주 비슷)
ï½ ê°ê°ì˜ IPC ìƒíƒœë³´ëŠ” 명령어(í„°ë¯¸ë„ ì°½ì—ì„œ)
â—¦ ì„¸ë§ˆí¬ ìƒíƒœ 보기
 ipcs –s
â—¦ 공유 메모리 ìƒíƒœ 보기
 ipcs –m
â—¦ 메시지 í ìƒíƒœ 보기
ï‚– ipcs -q
ï½ ì†Œì¼“ì´ëž€..?
â—¦ Ch13, 14장ì—ì„œ ë‹¤ë£¨ì—ˆë˜ ê²ƒê³¼ 근본ì ì¸ ì°¨ì´ë¥¼ ë³´ì¸ë‹¤. 소켓ì—
서는 여러 ì»´í“¨í„°ë“¤ì˜ ê²½ê³„ë¥¼ 넘나들 수 있다.
ì†Œì¼“ì˜ ì‚¬ìš© ë°©ë²•ì€ íŒŒì´í”„ 사용 방법과 매우 비슷하지만, 여러 ì»´
í“¨í„°ë“¤ì˜ ë„¤íŠ¸ì›Œí¬ë¥¼ 가로질러서 ìžë£Œë¥¼ ì£¼ê³ ë°›ì„ ìˆ˜ 있는 능력
ì€ ì†Œì¼“ì—만 해당ëœë‹¤. í•œ ì»´í“¨í„°ì˜ í”„ë¡œì„¸ìŠ¤ëŠ” ì†Œì¼“ì„ í†µí•´ì„œ 다
른 ì»´í“¨í„°ì˜ í”„ë¡œì„¸ìŠ¤ì™€ 통신할 수 있으며, ì´ë¥¼ 통해서 네트워í¬
ìƒì— ë¶„ì‚°ëœ í´ë¼ì´ì–¸íŠ¸/서버 ì‹œìŠ¤í…œì„ êµ¬ì¶•í•  수 있다.
ex) ì›ê²© ì¸ì‡„, ë°ì´í„°ë² ì´ìŠ¤ ì—°ê²°, 웹 서버 기능 등.
â—¦ *소켓 ì¸í„°íŽ˜ì´ìŠ¤ëŠ” Windowsë„ ì§€ì›í•˜ë©°, 윈ì†(WinSock)ì´ë¼ê³ 
부른다.
ï½ ì£¼ì œ
â—¦ 소켓 ì—°ê²°ì˜ ìž‘ë™ ë°©ì‹
â—¦ ì†Œì¼“ì˜ íŠ¹ì„±ë“¤ê³¼ 주소, 통신
â—¦ ë„¤íŠ¸ì›Œí¬ ì •ë³´ì™€ ì¸í„°ë„· ë°ëª¬
â—¦ í´ë¼ì´ì–¸íŠ¸ì™€ 서버
ï½ ì†Œì¼“ ì—°ê²°
â—¦ 1. 서버 ì‘ìš©í”„ë¡œê·¸ëž¨ì´ ì†Œì¼“ì„ ìƒì„±í•œë‹¤. 서버는 시스템 호출 socketì„ ì´ìš©, 소
ì¼“ì„ ìƒì„±.(ì´ ì†Œì¼“ì€ ë‹¤ë¥¸ 프로세스와 공유ë˜ì§€ 못한다.
â—¦ 2.서버 프로세스는 ê·¸ ì†Œì¼“ì— í•˜ë‚˜ì˜ ì´ë¦„ì„ ë¶€ì—¬í•œë‹¤. ë„¤íŠ¸ì›Œí¬ ì†Œì¼“ì˜ ê²½ìš° í´ë¼
ì´ì–¸íŠ¸ê°€ ì—°ê²°í•  수 있는 특정 네트워í¬ì— ê´€ë ¨ëœ ì„œë¹„ìŠ¤ ì‹ë³„ìžê°€ 부여ëœë‹¤.
ì†Œì¼“ì— ì´ë¦„ì„ ë¶€ì—¬í•  ë•Œ 사용하는 시스템 í˜¸ì¶œì€ bind ì´ë‹¤. ì´ë¦„ì„ ë¶€ì—¬í•œ 후,
서버 프로세스는 해당 ì†Œì¼“ì— í´ë¼ì´ì–¸íŠ¸ê°€ ì—°ê²°ë˜ê¸°ë¥¼ 기다린다. ì´ë¥¼ 위한 시스
í…œ í˜¸ì¶œì€ listenì´ë©°, ì´ í•¨ìˆ˜ëŠ” 들어오는 ì—°ê²°ì„ ìœ„í•œ ëŒ€ê¸°ì—´ì„ ìƒì„±í•œë‹¤. ì—°ê²°
ìš”ì²­ì´ ë“¤ì–´ì˜¤ë©´ 서버는 시스템 호출 accept를 ì´ìš©í•´ì„œ ê·¸ ìš”ì²­ì„ ë°›ì•„ë“¤ì¸ë‹¤.
서버가 accept를 호출하면, ëª…ëª…ëœ ì†Œì¼“ê³¼ëŠ” 개별ì ì¸ 새로운 ì†Œì¼“ì´ ìƒì„±ëœë‹¤.
ì´ ìƒˆ ì†Œì¼“ì€ í•´ë‹¹ í´ë¼ì´ì–¸íŠ¸ í•˜ë‚˜ì™€ì˜ í†µì‹ ì—만 ì“°ì¸ë‹¤.
-í´ë¼ì´ì–¸íŠ¸ ìª½ì˜ ì†Œì¼“ 기반 ì‹œìŠ¤í…œì€ í›¨ì”¬ 간단하다. í´ë¼ì´ì–¸íŠ¸ëŠ” socketì„
호출해서 ì´ë¦„없는 ì†Œì¼“ì„ ìƒì„±, ê·¸ 다ìŒì—는 ì„œë²„ì˜ ëª…ëª…ëœ ì†Œì¼“ì„ ì£¼ì†Œë¡œ
사용해 connect를 í˜¸ì¶œí•¨ìœ¼ë¡œì¨ ì„œë²„ì™€ì˜ ì—°ê²°ì„ ë§Œë“ ë‹¤.
ï½ ì†Œì¼“ 특성들.
â—¦ ì†Œì¼“ì„ ê·œì •í•˜ëŠ” 가장 중요한 특성 세 가지는 ë„ë©”ì¸, 종류, 프로토콜 ì´ë‹¤.
â—¦ ì†Œì¼“ì€ ë˜í•œ 주소로 ì“°ì´ëŠ” ì´ë¦„ë„ ê°€ì§€ëŠ”ë°, ì£¼ì†Œì˜ í˜•ì‹ì€ ë„ë©”ì¸ì— ë”°ë¼ ë‹¤ë¥´ë‹¤.
â—¦ ë„ë©”ì¸ì„ 프로토콜 패밀리ë¼ê³  ë¶€ë¥´ê¸°ë„ í•œë‹¤.
â—¦ 소켓 ë„ë©”ì¸.
ï‚– ë„ë©”ì¸ì€ 소켓 í†µì‹ ì´ ì‚¬ìš©í•  ë„¤íŠ¸ì›Œí¬ ë§¤ì²´ë¥¼ 결정한다. 가장 í”히 ì“°ì´ëŠ” 소켓 ë„ë©”ì¸ì€
AF_INET으로, ì´ê²ƒì€ ì¸í„°ë„· ìžì²´ëŠ” 물론 여러 리눅스 근거리 통신ë§ì—ë„ ì“°ì´ëŠ” ì¸í„°ë„·
ë„¤íŠ¸ì›Œí‚¹ì— í•´ë‹¹í•œë‹¤. ì´ ë„ë©”ì¸ì˜ 프로토콜 패밀리는 ì¸í„°ë„· 프로토콜(IP)ì´ë‹¤.
ì¸í„°ë„· 프로토콜ì—ì„œ 네트워í¬ìƒì˜ 특정한 컴퓨터를 지칭하는 ë° ì“°ì´ëŠ” 주소 형ì‹ì€
IP주소 하나ë¿ì´ë‹¤
ï½ ì†Œì¼“ì˜ ì¢…ë¥˜
◦ 스트림 소켓
ï‚– 표준 ìž…, 출력 스트림과 다소 비슷한 ë©´ì„ ê°€ì§„ 스트림 ì†Œì¼“ì€ ìˆœì°¨ì ì¸, 그리고 신뢰성 있
는 ì–‘ë°©í–¥ ë°”ì´íŠ¸ 스트림 ë°©ì‹ì˜ ì—°ê²°ì„ ì œê³µí•œë‹¤.(신뢰성 : ì „ì†¡ëœ ìžë£Œê°€ 오류가 ë³´ê³ ë˜ì§€
ì•Šê³  소실ë˜ê±°ë‚˜, 복제ë˜ê±°ë‚˜, 순서가 바뀌는 ì¼ì€ 없다는 뜻)
â—¦ ë°ì´í„°ê·¸ëž¨ 소켓
ï‚– ì—°ê²°ì˜ ìœ ì§€ ë° ê´€ë¦¬ë¥¼ 수행하지 않는다. ë˜í•œ ì´ ì¢…ë¥˜ì˜ ì†Œì¼“ì—ì„œ 보낼 수 있는 í•˜ë‚˜ì˜ ë°
ì´í„°ê·¸ëž¨ì˜ í¬ê¸°ì—는 한계가 주어져 있다. ë°ì´í„°ê·¸ëž¨ì€ ë„ì¤‘ì— ì†Œì‹¤ë˜ê±°ë‚˜, 중복ë˜ê±°ë‚˜,
다른 ë°ì´í„°ê·¸ëž¨ê³¼ 순서가 바뀔 수 있다. (UDP/IP ì—°ê²°ì„ í†µí•´ 구현ëœë‹¤.)
ï‚– 순차성과 ì‹ ë¢°ì„±ì„ ë³´ìž¥í•˜ì§„ 않지만, ë„¤íŠ¸ì›Œí¬ ì—°ê²°ì„ ìœ ì§€í•  필요가 없기 ë•Œë¬¸ì— ìžì› 효
ìœ¨ì„±ì´ ì¢‹ë‹¤. ì—°ê²° ì„¤ì •í•˜ëŠ”ë° ì†Œìš” ì‹œê°„ì´ ì—†ê¸° ë•Œë¬¸ì— ì†ë„ë„ ë¹ ë¥´ë‹¤.
◦ 소켓 프로토콜
ï‚– 소켓 ì¢…ë¥˜ì˜ ì „ì†¡ ë©”ì»¤ë‹ˆì¦˜ì´ ì—¬ëŸ¬ ê°œì˜ í”„ë¡œí† ì½œë“¤ì„ ì œê³µí•˜ëŠ” 경우 í”„ë¡œê·¸ëž¨ì€ ê·¸ 중 하
나를 ì„ íƒí•  수 있다. ì±…ì—서는 다른 소켓 í”„ë¡œí† ì½œì€ ì‚¬ìš©í•˜ì§€ 않았다.
ï½ ì†Œì¼“ ìƒì„±
â—¦ int socket(int domain, int type, int protocol);
ï‚– domain ì€ ì†Œì¼“ì˜ ì£¼ì†Œ 패밀리를 ê²°ì •
ï‚– type 는 ì†Œì¼“ì— ì“°ì¼ í†µì‹ ì˜ ì¢…ë¥˜ë¥¼ ê²°ì •.
ï‚– protocolì€ ê·¸ í†µì‹ ì„ ìœ„í•œ í”„ë¡œí† ì½œì„ ê²°ì •.
ï‚– Socket 시스템 í˜¸ì¶œì€ í•˜ë‚˜ì˜ ì„œìˆ ìžë¥¼ ëŒë ¤ì£¼ëŠ”ë°, ì´ê²ƒì€ 저수준 파
ì¼ ì‹œìŠ¤í…œ 서술ìžì™€ 여러모로 비슷하다.
ï‚– ì†Œì¼“ì´ ì—°ê²°ë˜ë©´ ì´ ì„œìˆ ìžë¡œ 시스템 호출 read, write를 호출, ìžë£Œë¥¼
ì½ê±°ë‚˜ 쓸 수 있다. 소켓 ì—°ê²°ì„ ë낼 ë•Œì—는 close 사용.
ï½ ì†Œì¼“ ì´ë¦„ 붙ì´ê¸°
â—¦ int bind(int socket, const struct sockaddr* address,
size_t address_len);
ï‚– Bind 시스템 í˜¸ì¶œì€ socket 변수로 ì§€ì •ëœ ì´ë¦„ 없는 ì†Œì¼“ì— address 매개변수
ë¡œ ì§€ì •ëœ ì£¼ì†Œ êµ¬ì¡°ì²´ì— ë‹´ê¸´ 주소를 부여한다.
ï‚– Bind를 호출할 ë•Œì—는 특정 주소 구조체 í¬ì¸í„°ë¥¼ 반드시 ì¼ë°˜ì ì¸ 주소 형ì‹
í¬ì¸í„°(struct sockaddr*)ë¡œ ê°•ì œ 형변환해야 한다.
ï‚– bind는 성공 ì‹œ 0ì„, 실패 ì‹œ -1ì„ ë°˜í™˜.
ï½ ì†Œì¼“ ì—°ê²° 대기열 만들기
â—¦ int listen(int socket, int backlog);
ï‚– backlog 변수는 listenì´ ìƒì„±í•  ëŒ€ê¸°ì—´ì˜ í¬ê¸°, 즉 ëŒ€ê¸°ì—´ì— ë‹´ì„ ìˆ˜ 있는 ì—°
ê²° ìš”ì²­ë“¤ì˜ ìµœëŒ€ 개수ì´ë‹¤.
ï‚– listen함수는 성공 ì‹œ 0ì„, 실패 ì‹œ -1ì„ ëŒë ¤ì¤€ë‹¤.
ï½ ì—°ê²° 수ë½
â—¦ Int accept(int socket, struct sockaddr* address,
size_t* address_len);
Accept 시스템 í˜¸ì¶œì€ socket 변수로 ì§€ì •ëœ ì†Œì¼“ì— í´ë¼ì´ì–¸íŠ¸ê°€ ì—°ê²°ì„ ì‹œë„하길
기다린다. ê·¸ í´ë¼ì´ì–¸íŠ¸ëŠ” ì†Œì¼“ì˜ ëŒ€ê¸°ì—´ì˜ ì²« 번째 ì—°ê²° ìš”ì²­ì— í•´ë‹¹í•œë‹¤.
accept는 ê·¸ í´ë¼ì´ì–¸íŠ¸ì˜ í†µì‹ ì„ ìœ„í•œ 새 ì†Œì¼“ì„ ìƒì„±í•œ 후 ê·¸ê²ƒì˜ ì„œìˆ ìžë¥¼ 반환
한다. 새 ì†Œì¼“ì€ ì„œë²„ì˜ ì²­ì·¨ 소켓과 ê°™ì€ ì¢…ë¥˜ì´ë‹¤.
- socket 변수ì—는 반드시 bindë¡œ 명명, listen으로 ëŒ€ê¸°ì—´ì„ ë§Œë“  ì†Œì¼“ì˜ ì„œìˆ ìžë¥¼
지정해야 한다.
-address 변수가 가리키는 ê³³ì—는 ì—°ê²°ëœ í´ë¼ì´ì–¸íŠ¸ì˜ 주소 구조체가 설정ëœë‹¤.
-address_len 변수ì—는 í´ë¼ì´ì–¸íŠ¸ 주소 êµ¬ì¡°ì²´ì˜ ê¸¸ì´ë¥¼ ë‹´ì€ ë³€ìˆ˜ì˜ ì£¼ì†Œ 설정.
*ì†Œì¼“ì˜ ëŒ€ê¸°ì—´ì— ì—°ê²° ìš”ì²­ì´ í•˜ë‚˜ë„ ì—†ìœ¼ë©´ accept í˜¸ì¶œì´ ì°¨ë‹¨ë˜ë©°, í´ë¼ì´ì–¸íŠ¸
ê°€ ì—°ê²°ì„ ìš”ì²­í•˜ë©´ 비로소 서버 í”„ë¡œì„¸ìŠ¤ì˜ ì‹¤í–‰ì´ ìž¬ê°œëœë‹¤
ï½ ì—°ê²° 요청
â—¦ int connect(int socket, const struct sockaddr* address,
size_t address_len);
ï‚– Socket 변수는 í´ë¼ì´ì–¸íŠ¸ìª½ ì†Œì¼“ì˜ ì„œìˆ ìžì´ê³  address는 서버쪽 ì†Œì¼“ì˜ ì£¼
소를 ë‹´ì€ êµ¬ì¡°ì²´ë¥¼ 가리킨다.
ï‚– Address_lenì€ ê·¸ êµ¬ì¡°ì²´ì˜ ê¸¸ì´ì´ë‹¤.
ï‚– Socket변수ì—는 반드시 socket 호출로 ì–»ì€ ìœ íš¨í•œ 서술ìžë¥¼ 지정해야한다.
ï‚– connect는 성공시 0, 실패시 -1ì„ ëŒë ¤ì¤€ë‹¤.
ï½ ì†Œì¼“ 닫기
â—¦ Close를 호출해서 ì†Œì¼“ì—°ê²°ì„ ë낼 수 있다.
ï½ ë‹¤ì¤‘ í´ë¼ì´ì–¸íŠ¸
â—¦ í•˜ë‚˜ì˜ ì„œë²„ì— ì—¬ëŸ¬ ê°œì˜ í´ë¼ì´ì–¸íŠ¸ë“¤ì´ ë™ì‹œì— 연결하
는 경우.
ï‚– 서버 프로그램 측ì—ì„œ fork를 ì´ìš©, 다중 í´ë¼ì´ì–¸íŠ¸ë¥¼ 처리할 ìˆ˜ë„ ìžˆ
으며 select 함수를 ì´ìš©í•˜ì—¬ 처리 í•  ìˆ˜ë„ ìžˆë‹¤.
ï‚– 여기서 select란, 시스템 í˜¸ì¶œë¡œì¨ ì €ìˆ˜ì¤€ íŒŒì¼ ì„œìˆ ìžë“¤ì„ í•˜ë‚˜ì˜ ë‹¨
위로 취급해서 그것들 중 í•˜ë‚˜ì— ìž…ë ¥ì´ ë“¤ì–´ì˜¤ê¸°ë¥¼(ë˜ëŠ” ì¶œë ¥ì´ ì™„ë£Œ
ë˜ê¸¸) 기다릴 수 있다. 만약 다중 í´ë¼ì´ì–¸íŠ¸ì—ì„œ 사용한다면, 서버 쪽
ì²­ì·¨ 소켓과 í´ë¼ì´ì–¸íŠ¸ ì—°ê²° 소켓 모ë‘를 ë™ì‹œì— 기다린다. 둘 중 하
나ë¼ë„ 활ë™ì´ ê°ì§€ë˜ë©´, 모든 가능한 íŒŒì¼ ì„œìˆ ìžë¥¼ ì ê²€, ì–´ë–¤ 소켓
ì´ ê¹¨ì–´ë‚¬ëŠ”ì§€ 파악, ê·¸ì— ë”°ë¼ ì ì ˆí•œ 처리를 수행한다.
ï‚– 서버 쪽 ì²­ì·¨ ì†Œì¼“ì— ìž…ë ¥ì´ ë“¤ì–´ì™”ë‹¤ë©´ ì–´ë–¤ í´ë¼ì´ì–¸íŠ¸ê°€ 서버와ì˜
ì—°ê²°ì„ ì‹œë„í•œ 것ì´ë‹¤. ì´ ê²½ìš° ì°¨ë‹¨ì„ ê±±ì •í•˜ì§€ ì•Šê³  accept를 호출
할 수 있다.
ï½ ê°„ë‹¨í•œ 실습 (client 쪽, client1.c)
그냥 client1만 실행시키면,
Server와 ê°™ì´ ì‹¤í–‰ì‹œí‚¤ë©´
ï½ ê°„ë‹¨í•œ 실습(server1.c 서버 쪽)
./server1 & ì„ ìž…ë ¥, server1ì„
백그ë¼ìš´ë“œ 작업하여 client1ì„
실행시키는ë°,
./server1 & 후 ps ì˜ ìƒíƒœëŠ”,
그리고 서버는 íŒŒì¼ ì‹œìŠ¤í…œìƒì˜ 소켓ì„
ìƒì„±í•˜ëŠ”ë° ê·¸ 파ì¼ì€ ls 명령으로 ë³¼ 수 있다
다 사용한 ì†Œì¼“ì€ ì œê±°í•˜ëŠ” ê²ƒì´ ì¢‹ë‹¤.
(í”„ë¡œê·¸ëž¨ì´ ì‹ í˜¸ì— ì˜í•´ì„œ 비정ìƒì ìœ¼ë¡œ
종료ë˜ì—ˆë‹¤ë©´, ì†Œì¼“ì´ ë‚¨ì•„ 있는지 확ì¸,
제거해야 íŒŒì¼ ì‹œìŠ¤í…œì´ ì§€ì €ë¶„í•´ì§€ëŠ” 것ì„
피할 수 있다.
ï½ ê°„ë‹¨í•œ ì‹¤ìŠµì— ëŒ€í•œâ€¦
â—¦ 서버는 í´ë¼ì´ì–¸íŠ¸ê°€ 기ë¡í•œ ë¬¸ìž í•˜ë‚˜ë¥¼ ì½ì–´ì„œ ê·¸ê²ƒì„ ì¦ê°€í•œ 후
다시 í´ë¼ì´ì–¸íŠ¸ì—게 보낸다.(출력하는 ê±´ í´ë¼ì´ì–¸íŠ¸ 측)
ë” ìƒì„¸ížˆ 공부하고 싶었지만 ì²˜ìŒ ì±…ì„ ì •ë…한것ì—
대해 ë§Œì¡±ì„ í•˜ë©°, 프로그래ë°ì„ í•  ë•Œ, 다시 ì±…ì„
ë³¼ ë•Œ, 좀 ë” ì½”ë“œ 부분과 ì§ì ‘ 프로그래ë°í•˜ëŠ”ê±°
ì— ì¤‘ì ì„ 둘 필요가 있다고 ìƒê°ì´ 드는 공부였다.
그리고 중요하다고 ìƒê°ë˜ëŠ” 부분만 공부하였는ë°
ì°¨í›„ì— ê³µë¶€í•  ë•Œì—는 다른 ë¶€ë¶„ë„ ê³µë¶€ë¥¼ 해야겠
다. ë˜ ì†Œì¼“ í”„ë¡œê·¸ëž˜ë° ê°™ì€ ë¶€ë¶„ì€ ë”°ë¡œ ì±…ì´ ìžˆ
으니 ê·¸ ë¶€ë¶„ì— ëŒ€í•´ì„œ ë” ê³µë¶€í•  í•„ìš”ì„±ì´ ëŠê»´ì§„
다.
Linux programming study

More Related Content

What's hot (20)

System+os study 3
System+os study 3System+os study 3
System+os study 3
J J
Ìý
[2017 Incognito] ìŠ¤íƒ êµ¬ì¡° 분ì„ì„ í†µí•œ ROP ê¸°ë²•ì˜ ëª¨ë“  것
[2017 Incognito] ìŠ¤íƒ êµ¬ì¡° 분ì„ì„ í†µí•œ ROP ê¸°ë²•ì˜ ëª¨ë“  것[2017 Incognito] ìŠ¤íƒ êµ¬ì¡° 분ì„ì„ í†µí•œ ROP ê¸°ë²•ì˜ ëª¨ë“  것
[2017 Incognito] ìŠ¤íƒ êµ¬ì¡° 분ì„ì„ í†µí•œ ROP ê¸°ë²•ì˜ ëª¨ë“  것
NAVER D2
Ìý
System+os study 5
System+os study 5System+os study 5
System+os study 5
J J
Ìý
[2017 Incognito] 시스템 해킹 기법 정리
[2017 Incognito] 시스템 해킹 기법 정리[2017 Incognito] 시스템 해킹 기법 정리
[2017 Incognito] 시스템 해킹 기법 정리
NAVER D2
Ìý
Tcpdump
TcpdumpTcpdump
Tcpdump
jeonghoon
Ìý
Pwnable study basic_3
Pwnable study basic_3Pwnable study basic_3
Pwnable study basic_3
J J
Ìý
10장 문ìžì—´í´ëž˜ìŠ¤ì™€íŒŒì¼í´ëž˜ìŠ¤
10장 문ìžì—´í´ëž˜ìŠ¤ì™€íŒŒì¼í´ëž˜ìŠ¤10장 문ìžì—´í´ëž˜ìŠ¤ì™€íŒŒì¼í´ëž˜ìŠ¤
10장 문ìžì—´í´ëž˜ìŠ¤ì™€íŒŒì¼í´ëž˜ìŠ¤
ì›…ì‹ ì „
Ìý
Linux reversing study_basic_4
Linux reversing study_basic_4Linux reversing study_basic_4
Linux reversing study_basic_4
J J
Ìý
10장 문자열 á„ᅳᆯ래스와 파일 á„ᅳᆯ래스
10장 문자열 á„ᅳᆯ래스와 파일 á„ᅳᆯ래스10장 문자열 á„ᅳᆯ래스와 파일 á„ᅳᆯ래스
10장 문자열 á„ᅳᆯ래스와 파일 á„ᅳᆯ래스
ìœ ì„ ë‚¨
Ìý
Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706
Yong Joon Moon
Ìý
Windows reversing study_basic_9
Windows reversing study_basic_9Windows reversing study_basic_9
Windows reversing study_basic_9
J J
Ìý
Python
PythonPython
Python
J J
Ìý
Windows reversing study_basic_1
Windows reversing study_basic_1Windows reversing study_basic_1
Windows reversing study_basic_1
J J
Ìý
200523 서울여대 BI 코딩실무 ê°•ì˜ ìžë£Œ
200523 서울여대 BI 코딩실무 ê°•ì˜ ìžë£Œ200523 서울여대 BI 코딩실무 ê°•ì˜ ìžë£Œ
200523 서울여대 BI 코딩실무 ê°•ì˜ ìžë£Œ
Joohyun Han
Ìý
Pwnable study basic_1
Pwnable study basic_1Pwnable study basic_1
Pwnable study basic_1
J J
Ìý
Windws via c/c++ chapter 6
Windws via c/c++ chapter 6Windws via c/c++ chapter 6
Windws via c/c++ chapter 6
SukYun Yoon
Ìý
[강릉ì›ì£¼ëŒ€ 대기환경과학과] 대기과학전산입문 설명서
[강릉ì›ì£¼ëŒ€ 대기환경과학과] 대기과학전산입문 설명서[강릉ì›ì£¼ëŒ€ 대기환경과학과] 대기과학전산입문 설명서
[강릉ì›ì£¼ëŒ€ 대기환경과학과] 대기과학전산입문 설명서
Lee Sang-Ho
Ìý
20160427 ROS 4ì°¨ ê°•ì˜ (for 아스ë¼ë‹¤ 팀)
20160427 ROS 4ì°¨ ê°•ì˜ (for 아스ë¼ë‹¤ 팀)20160427 ROS 4ì°¨ ê°•ì˜ (for 아스ë¼ë‹¤ 팀)
20160427 ROS 4ì°¨ ê°•ì˜ (for 아스ë¼ë‹¤ 팀)
Yoonseok Pyo
Ìý
Assembly 스터디 2
Assembly 스터디 2Assembly 스터디 2
Assembly 스터디 2
J J
Ìý
PINTOS Operating system homework
PINTOS Operating system homeworkPINTOS Operating system homework
PINTOS Operating system homework
Gichan Lee
Ìý
System+os study 3
System+os study 3System+os study 3
System+os study 3
J J
Ìý
[2017 Incognito] ìŠ¤íƒ êµ¬ì¡° 분ì„ì„ í†µí•œ ROP ê¸°ë²•ì˜ ëª¨ë“  것
[2017 Incognito] ìŠ¤íƒ êµ¬ì¡° 분ì„ì„ í†µí•œ ROP ê¸°ë²•ì˜ ëª¨ë“  것[2017 Incognito] ìŠ¤íƒ êµ¬ì¡° 분ì„ì„ í†µí•œ ROP ê¸°ë²•ì˜ ëª¨ë“  것
[2017 Incognito] ìŠ¤íƒ êµ¬ì¡° 분ì„ì„ í†µí•œ ROP ê¸°ë²•ì˜ ëª¨ë“  것
NAVER D2
Ìý
System+os study 5
System+os study 5System+os study 5
System+os study 5
J J
Ìý
[2017 Incognito] 시스템 해킹 기법 정리
[2017 Incognito] 시스템 해킹 기법 정리[2017 Incognito] 시스템 해킹 기법 정리
[2017 Incognito] 시스템 해킹 기법 정리
NAVER D2
Ìý
Tcpdump
TcpdumpTcpdump
Tcpdump
jeonghoon
Ìý
Pwnable study basic_3
Pwnable study basic_3Pwnable study basic_3
Pwnable study basic_3
J J
Ìý
10장 문ìžì—´í´ëž˜ìŠ¤ì™€íŒŒì¼í´ëž˜ìŠ¤
10장 문ìžì—´í´ëž˜ìŠ¤ì™€íŒŒì¼í´ëž˜ìŠ¤10장 문ìžì—´í´ëž˜ìŠ¤ì™€íŒŒì¼í´ëž˜ìŠ¤
10장 문ìžì—´í´ëž˜ìŠ¤ì™€íŒŒì¼í´ëž˜ìŠ¤
ì›…ì‹ ì „
Ìý
Linux reversing study_basic_4
Linux reversing study_basic_4Linux reversing study_basic_4
Linux reversing study_basic_4
J J
Ìý
10장 문자열 á„ᅳᆯ래스와 파일 á„ᅳᆯ래스
10장 문자열 á„ᅳᆯ래스와 파일 á„ᅳᆯ래스10장 문자열 á„ᅳᆯ래스와 파일 á„ᅳᆯ래스
10장 문자열 á„ᅳᆯ래스와 파일 á„ᅳᆯ래스
ìœ ì„ ë‚¨
Ìý
Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706
Yong Joon Moon
Ìý
Windows reversing study_basic_9
Windows reversing study_basic_9Windows reversing study_basic_9
Windows reversing study_basic_9
J J
Ìý
Python
PythonPython
Python
J J
Ìý
Windows reversing study_basic_1
Windows reversing study_basic_1Windows reversing study_basic_1
Windows reversing study_basic_1
J J
Ìý
200523 서울여대 BI 코딩실무 ê°•ì˜ ìžë£Œ
200523 서울여대 BI 코딩실무 ê°•ì˜ ìžë£Œ200523 서울여대 BI 코딩실무 ê°•ì˜ ìžë£Œ
200523 서울여대 BI 코딩실무 ê°•ì˜ ìžë£Œ
Joohyun Han
Ìý
Pwnable study basic_1
Pwnable study basic_1Pwnable study basic_1
Pwnable study basic_1
J J
Ìý
Windws via c/c++ chapter 6
Windws via c/c++ chapter 6Windws via c/c++ chapter 6
Windws via c/c++ chapter 6
SukYun Yoon
Ìý
[강릉ì›ì£¼ëŒ€ 대기환경과학과] 대기과학전산입문 설명서
[강릉ì›ì£¼ëŒ€ 대기환경과학과] 대기과학전산입문 설명서[강릉ì›ì£¼ëŒ€ 대기환경과학과] 대기과학전산입문 설명서
[강릉ì›ì£¼ëŒ€ 대기환경과학과] 대기과학전산입문 설명서
Lee Sang-Ho
Ìý
20160427 ROS 4ì°¨ ê°•ì˜ (for 아스ë¼ë‹¤ 팀)
20160427 ROS 4ì°¨ ê°•ì˜ (for 아스ë¼ë‹¤ 팀)20160427 ROS 4ì°¨ ê°•ì˜ (for 아스ë¼ë‹¤ 팀)
20160427 ROS 4ì°¨ ê°•ì˜ (for 아스ë¼ë‹¤ 팀)
Yoonseok Pyo
Ìý
Assembly 스터디 2
Assembly 스터디 2Assembly 스터디 2
Assembly 스터디 2
J J
Ìý
PINTOS Operating system homework
PINTOS Operating system homeworkPINTOS Operating system homework
PINTOS Operating system homework
Gichan Lee
Ìý

Similar to Linux programming study (20)

shell and process
shell and processshell and process
shell and process
Chulgyu Shin
Ìý
Network researching
Network researchingNetwork researching
Network researching
hyeok gyu Kwon
Ìý
리눅스 á„ᅥ널 기초 á„ᅢ스á„ᅳ관리
리눅스 á„ᅥ널 기초 á„ᅢ스á„ᅳ관리리눅스 á„ᅥ널 기초 á„ᅢ스á„ᅳ관리
리눅스 á„ᅥ널 기초 á„ᅢ스á„ᅳ관리
Seungyong Lee
Ìý
실무로 배우는 시스템 성능 최ì í™” 8부 - 1,2,3장
실무로 배우는 시스템 성능 최ì í™” 8부 - 1,2,3장실무로 배우는 시스템 성능 최ì í™” 8부 - 1,2,3장
실무로 배우는 시스템 성능 최ì í™” 8부 - 1,2,3장
Sunggon Song
Ìý
Linux ê°•ì˜ìžë£Œ ed10
Linux ê°•ì˜ìžë£Œ ed10Linux ê°•ì˜ìžë£Œ ed10
Linux ê°•ì˜ìžë£Œ ed10
hungrok
Ìý
파ì´ì¬ 병렬프로그래ë°
파ì´ì¬ 병렬프로그래ë°íŒŒì´ì¬ 병렬프로그래ë°
파ì´ì¬ 병렬프로그래ë°
Yong Joon Moon
Ìý
IoT with Raspberry Pi + Node JS - Chapter 1
IoT with Raspberry Pi + Node JS - Chapter 1IoT with Raspberry Pi + Node JS - Chapter 1
IoT with Raspberry Pi + Node JS - Chapter 1
Park Jonggun
Ìý
Windows via C/C++ 06 ìŠ¤ë ˆë“œì˜ ê¸°ë³¸
Windows via C/C++ 06 ìŠ¤ë ˆë“œì˜ ê¸°ë³¸Windows via C/C++ 06 ìŠ¤ë ˆë“œì˜ ê¸°ë³¸
Windows via C/C++ 06 ìŠ¤ë ˆë“œì˜ ê¸°ë³¸
ssuser0c2478
Ìý
Hyperledger farbric build your first network install and analysis
Hyperledger farbric   build your first network install and analysisHyperledger farbric   build your first network install and analysis
Hyperledger farbric build your first network install and analysis
병준 김
Ìý
UNIX 시스템 2014-2018ë…„ 기ë§ì‹œí—˜ 기출문제
UNIX 시스템 2014-2018ë…„ 기ë§ì‹œí—˜ 기출문제UNIX 시스템 2014-2018ë…„ 기ë§ì‹œí—˜ 기출문제
UNIX 시스템 2014-2018ë…„ 기ë§ì‹œí—˜ 기출문제
Lee Sang-Ho
Ìý
OS Process, Thread, CPU Schedulingì— ëŒ€í•´ 알아봅시다.pdf
OS Process, Thread, CPU Schedulingì— ëŒ€í•´ 알아봅시다.pdfOS Process, Thread, CPU Schedulingì— ëŒ€í•´ 알아봅시다.pdf
OS Process, Thread, CPU Schedulingì— ëŒ€í•´ 알아봅시다.pdf
Ho Jeong Im
Ìý
Thread programming
Thread programmingThread programming
Thread programming
YoonJong Choi
Ìý
Windows via c++ chapter6
Windows via c++   chapter6Windows via c++   chapter6
Windows via c++ chapter6
Shin heemin
Ìý
고급싵ӊ¤í…œí”„로그래ë°
고급싵ӊ¤í…œí”„로그래ë°ê³ ê¸‰ì‹µÓŠ¤í…œí”„로그래ë°
고급싵ӊ¤í…œí”„로그래ë°
Seungbeom Shim
Ìý
Nodejs_chapter3
Nodejs_chapter3Nodejs_chapter3
Nodejs_chapter3
Yoon Hee Hwang
Ìý
Buffer Overflow PPT (OneTwo)
Buffer Overflow PPT (OneTwo)Buffer Overflow PPT (OneTwo)
Buffer Overflow PPT (OneTwo)
one_two_12
Ìý
하둡 타입과 í¬ë§·
하둡 타입과 í¬ë§·í•˜ë‘¡ 타입과 í¬ë§·
하둡 타입과 í¬ë§·
진호 박
Ìý
[IoT] MAKE with Open H/W + Node.JS - 2nd
[IoT] MAKE with Open H/W + Node.JS - 2nd[IoT] MAKE with Open H/W + Node.JS - 2nd
[IoT] MAKE with Open H/W + Node.JS - 2nd
Park Jonggun
Ìý
linux1
linux1linux1
linux1
sjw1969
Ìý
[2014 CodeEngn Conference 11] ì´ê²½ì‹ - ë™ì  ì¶”ì  í”„ë ˆìž„ì›Œí¬ë¥¼ ì´ìš©í•œ OS X ë°”ì´ë„ˆë¦¬ 분ì„
[2014 CodeEngn Conference 11] ì´ê²½ì‹ - ë™ì  ì¶”ì  í”„ë ˆìž„ì›Œí¬ë¥¼ ì´ìš©í•œ OS X ë°”ì´ë„ˆë¦¬ 분ì„[2014 CodeEngn Conference 11] ì´ê²½ì‹ - ë™ì  ì¶”ì  í”„ë ˆìž„ì›Œí¬ë¥¼ ì´ìš©í•œ OS X ë°”ì´ë„ˆë¦¬ 분ì„
[2014 CodeEngn Conference 11] ì´ê²½ì‹ - ë™ì  ì¶”ì  í”„ë ˆìž„ì›Œí¬ë¥¼ ì´ìš©í•œ OS X ë°”ì´ë„ˆë¦¬ 분ì„
GangSeok Lee
Ìý
shell and process
shell and processshell and process
shell and process
Chulgyu Shin
Ìý
Network researching
Network researchingNetwork researching
Network researching
hyeok gyu Kwon
Ìý
리눅스 á„ᅥ널 기초 á„ᅢ스á„ᅳ관리
리눅스 á„ᅥ널 기초 á„ᅢ스á„ᅳ관리리눅스 á„ᅥ널 기초 á„ᅢ스á„ᅳ관리
리눅스 á„ᅥ널 기초 á„ᅢ스á„ᅳ관리
Seungyong Lee
Ìý
실무로 배우는 시스템 성능 최ì í™” 8부 - 1,2,3장
실무로 배우는 시스템 성능 최ì í™” 8부 - 1,2,3장실무로 배우는 시스템 성능 최ì í™” 8부 - 1,2,3장
실무로 배우는 시스템 성능 최ì í™” 8부 - 1,2,3장
Sunggon Song
Ìý
Linux ê°•ì˜ìžë£Œ ed10
Linux ê°•ì˜ìžë£Œ ed10Linux ê°•ì˜ìžë£Œ ed10
Linux ê°•ì˜ìžë£Œ ed10
hungrok
Ìý
파ì´ì¬ 병렬프로그래ë°
파ì´ì¬ 병렬프로그래ë°íŒŒì´ì¬ 병렬프로그래ë°
파ì´ì¬ 병렬프로그래ë°
Yong Joon Moon
Ìý
IoT with Raspberry Pi + Node JS - Chapter 1
IoT with Raspberry Pi + Node JS - Chapter 1IoT with Raspberry Pi + Node JS - Chapter 1
IoT with Raspberry Pi + Node JS - Chapter 1
Park Jonggun
Ìý
Windows via C/C++ 06 ìŠ¤ë ˆë“œì˜ ê¸°ë³¸
Windows via C/C++ 06 ìŠ¤ë ˆë“œì˜ ê¸°ë³¸Windows via C/C++ 06 ìŠ¤ë ˆë“œì˜ ê¸°ë³¸
Windows via C/C++ 06 ìŠ¤ë ˆë“œì˜ ê¸°ë³¸
ssuser0c2478
Ìý
Hyperledger farbric build your first network install and analysis
Hyperledger farbric   build your first network install and analysisHyperledger farbric   build your first network install and analysis
Hyperledger farbric build your first network install and analysis
병준 김
Ìý
UNIX 시스템 2014-2018ë…„ 기ë§ì‹œí—˜ 기출문제
UNIX 시스템 2014-2018ë…„ 기ë§ì‹œí—˜ 기출문제UNIX 시스템 2014-2018ë…„ 기ë§ì‹œí—˜ 기출문제
UNIX 시스템 2014-2018ë…„ 기ë§ì‹œí—˜ 기출문제
Lee Sang-Ho
Ìý
OS Process, Thread, CPU Schedulingì— ëŒ€í•´ 알아봅시다.pdf
OS Process, Thread, CPU Schedulingì— ëŒ€í•´ 알아봅시다.pdfOS Process, Thread, CPU Schedulingì— ëŒ€í•´ 알아봅시다.pdf
OS Process, Thread, CPU Schedulingì— ëŒ€í•´ 알아봅시다.pdf
Ho Jeong Im
Ìý
Thread programming
Thread programmingThread programming
Thread programming
YoonJong Choi
Ìý
Windows via c++ chapter6
Windows via c++   chapter6Windows via c++   chapter6
Windows via c++ chapter6
Shin heemin
Ìý
고급싵ӊ¤í…œí”„로그래ë°
고급싵ӊ¤í…œí”„로그래ë°ê³ ê¸‰ì‹µÓŠ¤í…œí”„로그래ë°
고급싵ӊ¤í…œí”„로그래ë°
Seungbeom Shim
Ìý
Buffer Overflow PPT (OneTwo)
Buffer Overflow PPT (OneTwo)Buffer Overflow PPT (OneTwo)
Buffer Overflow PPT (OneTwo)
one_two_12
Ìý
하둡 타입과 í¬ë§·
하둡 타입과 í¬ë§·í•˜ë‘¡ 타입과 í¬ë§·
하둡 타입과 í¬ë§·
진호 박
Ìý
[IoT] MAKE with Open H/W + Node.JS - 2nd
[IoT] MAKE with Open H/W + Node.JS - 2nd[IoT] MAKE with Open H/W + Node.JS - 2nd
[IoT] MAKE with Open H/W + Node.JS - 2nd
Park Jonggun
Ìý
linux1
linux1linux1
linux1
sjw1969
Ìý
[2014 CodeEngn Conference 11] ì´ê²½ì‹ - ë™ì  ì¶”ì  í”„ë ˆìž„ì›Œí¬ë¥¼ ì´ìš©í•œ OS X ë°”ì´ë„ˆë¦¬ 분ì„
[2014 CodeEngn Conference 11] ì´ê²½ì‹ - ë™ì  ì¶”ì  í”„ë ˆìž„ì›Œí¬ë¥¼ ì´ìš©í•œ OS X ë°”ì´ë„ˆë¦¬ 분ì„[2014 CodeEngn Conference 11] ì´ê²½ì‹ - ë™ì  ì¶”ì  í”„ë ˆìž„ì›Œí¬ë¥¼ ì´ìš©í•œ OS X ë°”ì´ë„ˆë¦¬ 분ì„
[2014 CodeEngn Conference 11] ì´ê²½ì‹ - ë™ì  ì¶”ì  í”„ë ˆìž„ì›Œí¬ë¥¼ ì´ìš©í•œ OS X ë°”ì´ë„ˆë¦¬ 분ì„
GangSeok Lee
Ìý

Linux programming study

  • 2. ï½ ì£¼ìš” 챕터 ï½ ê°ê°ì˜ ì±•í„°ì— ëŒ€í•œ ì´ë¡  ï½ ì½”ë“œ ë° ì„¤ëª… ï½ ê³µë¶€í•˜ë©´ì„œ ë°°ìš´ 것, ëŠë‚€ì .
  • 3. ï½ Ch3. íŒŒì¼ ë‹¤ë£¨ê¸° ï½ Ch11.프로세스와 신호 ï½ Ch12.쓰레드 ï½ Ch13.프로세스간 통신 : 파ì´í”„ ï½ Ch14. 세마í¬, 공유 메모리, 메시지 í ï½ Ch15. 소켓
  • 4. ï½ íŒŒì¼ê³¼ 디렉토리를 다루는 여러 가지 í•¨ìˆ˜ë“¤ì„ ìƒ ì„¸ížˆ 설명하는 ë° ì£¼ë ¥. â—¦ 파ì¼ê³¼ 장치 â—¦ 시스템 호출 â—¦ ë¼ì´ë¸ŒëŸ¬ë¦¬ 함수 â—¦ íŒŒì¼ ë‹¤ë£¨ê¸° â—¦ 표준 I/O ë¼ì´ë¸ŒëŸ¬ë¦¬ â—¦ ìž…,출력 ì„œì‹í™” â—¦ 파ì¼ê³¼ 디렉터리 관리 â—¦ 디렉터리 íƒìƒ‰ â—¦ 오류처리, /proc íŒŒì¼ ì‹œìŠ¤í…œ, fcntlê³¼ mmap
  • 5. ï½ ì €ìˆ˜ì¤€ íŒŒì¼ ì ‘ê·¼ í•˜ë‚˜ì˜ í”„ë¡œê·¸ëž¨ì´ ì‹œë™ë  ë•Œì—는 ì¼ë°˜ì ìœ¼ë¡œ 세 ê°œì˜ íŒŒì¼ ì„œìˆ ìžë“¤ì´ ì´ë¯¸ 열린 ìƒíƒœì´ë‹¤. - 0 : 표준 ìž…ë ¥ - 1 : 표준 출력 - 2 : 표준 오류 ìœ„ì˜ íŒŒì¼ ì„œìˆ ìžëŠ” ìžë™ìœ¼ë¡œ 열리며, ë”°ë¼ì„œ í”„ë¡œê·¸ëž¨ì€ ë³„ë‹¤ë¥¸ 절차 ì—†ì´ Write를 ì´ìš©, 즉시 해당 ìž¥ì¹˜ì— ìžë£Œë¥¼ 기ë¡í•  수 있다.
  • 6. ï½ Write Write 시스템 í˜¸ì¶œì€ ë²„í¼ bufì— ìžˆëŠ” ì²˜ìŒ nbytes ê°œì˜ ë°”ì´íŠ¸ë“¤ì„ íŒŒì¼ ì„œìˆ ìž fildesì— ì—°ê´€ëœ íŒŒì¼ì— 기ë¡í•˜ê³ , 실제로 기ë¡í•œ ë°”ì´íŠ¸ 수를 ëŒ ë ¤ì¤€ë‹¤. 시스템 í˜¸ì¶œì˜ êµ¬ë¬¸ #include <unistd.h> Size_t write(int fildes, const void* buf, size_t nbytes);
  • 7. ï½ Read Read 시스템 í˜¸ì¶œì€ íŒŒì¼ ì„œìˆ ìž fildesì— ì—°ê´€ëœ íŒŒì¼ë¡œë¶€í„° nbytesê°œì˜ ë°” ì´íŠ¸ë“¤ì„ ì½ì–´ì„œ ê·¸ ë°”ì´íŠ¸ë“¤ì„ ë²„í¼ bufì— ì§‘ì–´ë„£ëŠ”ë‹¤. ë°˜í™˜ê°’ì€ ì‹¤ì œë¡œ ì½ì€ ë°”ì´íŠ¸ 개수ì¸ë°, 요청한 ë°”ì´íŠ¸ 수보다 ìž‘ì„ ìˆ˜ë„ ìžˆë‹¤. ë°˜í™˜ê°’ì´ 0ì´ë©´ 아무 ê²ƒë„ ì½ì§€ ì•Šì€ ê²ƒì´ë‹¤(파ì¼ì˜ ëì— ë„달한 경우). -1 ì€ ì˜¤ë¥˜ë¥¼ ì˜ë¯¸ #include <unistd.h> Size_t read(int fildes, void *buf,size_t nbytes);
  • 8. ï½ Open 새 íŒŒì¼ ì„œìˆ ìžë¥¼ 만들기 위해서는 open 시스템 í˜¸ì¶œì„ ì‚¬ìš©í•´ì•¼ 한다. #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> Int open(const char* path, int oflags); Int open(const char* path, int oflags, mode_t mode); 간단히 ë§í•˜ìžë©´ openì€ íŒŒì¼ ë˜ëŠ” ìž¥ì¹˜ë¡œì˜ ì ‘ê·¼ 경로를 만듬. Flagê°’ì„ í†µí•´ 모드 설정, O_RDONLY, O_WRONLY, O_RDWR ê°ê° ì½ê¸°, 쓰기, ì½ê¸° 쓰기 가능하게 하는 모드. (ì´ë“¤ 중 하나를 반드시 지정해야 한다.) (다른 플래그 ê°’ì´ ìžˆì§€ë§Œ ìƒì„¸í•œ ë¶€ë¶„ì€ ìƒëžµí•œë‹¤.)
  • 9. ï½ ì´ˆê¸° 권한 그림ì—ì„œ 보듯ì´, drwxrwxr-x :디렉토리, 사용ìž,그룹,다른 ì‚¬ìš©ìž Rì€ ì½ê¸°ê¶Œí•œ, w는 쓰기, x는 실행 ì´ë‹¤. ì´ í›„ì— close 함수, ioctl 함수가 ìžˆëŠ”ë° close는 íŒŒì¼ ì„œìˆ ìžì™€ 파ì¼ì˜ ì—°ê´€ ì„ ëŠëŠ” 함수, ioctl함수는 íŒŒì¼ ì„œìˆ ìž(fildes)ê°€ 가리키는 대ìƒì— 대해 cmdë¡œ ì§€ì •ëœ ê¸°ëŠ¥ì„ ìˆ˜í–‰í•œë‹¤.
  • 10. ï½ ë‚˜ë¨¸ì§€ íŒŒì¼ ê´€ë¦¬ 관련 시스템 호출들 -lseek : íŒŒì¼ ì„œìˆ ìž(fildes)ê°€ 가리키는 파ì¼ì˜ ì½ê¸°/쓰기 í¬ì¸í„° 설정한다. -fstat,stat,lstat : 파ì¼ì„œìˆ ìžì— ì—°ê´€ëœ íŒŒì¼ì˜ ìƒíƒœ 정보를 ëŒë ¤ì¤€ë‹¤. -dup, dup2 : íŒŒì¼ ì„œìˆ ìžë¥¼ 복제하는 ë° ì“°ì¸ë‹¤. ì´ í˜¸ì¶œë“¤ì— ëŒ€í•œ 변수나 ìžì„¸í•œ ì‚¬í•­ì€ ì°¸ì¡°í•˜ì—¬ 사용한다.
  • 11. ï½ í‘œì¤€ I/O ë¼ì´ë¸ŒëŸ¬ë¦¬ ->표준 I/O ë¼ì´ë¸ŒëŸ¬ë¦¬ì™€ 해당 í—¤ë” íŒŒì¼ì€ 저수준 I/O 시스템 í˜¸ì¶œë“¤ì— ëŒ€í•œ 융통성 있는 ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ 제공한다. ì•„ëž˜ì— ì„¤ëª…í•  ë¶€ë¶„ì€ ì €ìˆ˜ì¤€ 시스템 호출ì´ë‹¤. -fopen : ì´ í•¨ìˆ˜ëŠ” 주로 파ì¼ê³¼ 터미ë„ì˜ ìž….ì¶œë ¥ì— ì“°ì¸ë‹¤. ìž¥ì¹˜ë“¤ì„ ì¢€ ë” ëª…ì‹œì ìœ¼ ë¡œ 제어하려면 저수준 시스템 í˜¸ì¶œì„ ì‚¬ìš©í•˜ëŠ” ê²ƒì´ ì¢‹ë‹¤. -fread : íŒŒì¼ ìŠ¤íŠ¸ë¦¼ìœ¼ë¡œë¶€í„° ìžë£Œë¥¼ ì½ëŠ”ë° ì“°ì¸ë‹¤. ì½ì€ ìžë£ŒëŠ” ptrì´ ê°€ë¦¬í‚¤ëŠ” ìžë£Œ 버í¼ì— 기ë¡ëœë‹¤.fread, fwrite ëª¨ë‘ ìžë£Œë¥¼ 레코드 단위로 처리한다. -fclose : 스트림 매개변수로 ì§€ì •ëœ ìŠ¤íŠ¸ë¦¼ì„ ë‹«ëŠ”ë‹¤. ì´ë•Œ ì•„ì§ ê¸°ë¡ë˜ì§€ ì•Šì€ ìžë£Œê°€ ëª¨ë‘ ê¸°ë¡ëœë‹¤.명시ì ìœ¼ë¡œ 사용해주면 좋다. -fwrite : ì¸í„°íŽ˜ì´ìŠ¤ëŠ” fread와 비슷하다. 출력 ìŠ¤íŠ¸ë¦¼ì— ê¸°ë¡, 성공ì ìœ¼ë¡œ 기ë¡í•œ 레코 ë“œ 개수를 ëŒë ¤ì¤€ë‹¤. -fflush : 주어진 íŒŒì¼ ìŠ¤íŠ¸ë¦¼ì— ëŒ€í•´ 대기 ì¤‘ì¸ ëª¨ë“  ìžë£Œë¥¼ 즉시 기ë¡í•œë‹¤. 예) ëŒ€í™”ì‹ í”„ë¡¬í”„íŠ¸ê°€ 확실히 터미ë„ì— ì¶œë ¥ëœ í›„ì—만 사용ìžì˜ ìž…ë ¥ì„ ë°›ì•„ 들여야하 는 ê²½ìš°ì— ìœ ìš©.fclose 호출하는 ì‹œì ì—서는 fflush를 êµ³ì´ í˜¸ì¶œí•  필요가 없다. *í—¤ë”파ì¼ì€ stdio.h ì´ë‹¤.
  • 12. ï½ í‘œì¤€ I/O ë¼ì´ë¸ŒëŸ¬ë¦¬ -fseek : 시스템 호출 lseekì— í•´ë‹¹. ì´ í•¨ìˆ˜ëŠ” 스트림ì—ì„œ 다ìŒë²ˆì— ìžë£Œë¥¼ ì½ê±°ë‚˜ 쓸 위치를 설정한다. ì°¨ì´ì ì€ lseekì€ off_t, fseekì€ ì„±ê³µì‹œ 0, 실패시 -1 반환한다. -fget, getc, getchar : íŒŒì¼ ìŠ¤íŠ¸ë¦¼ì—ì„œ ë‹¤ìŒ ë°”ì´íŠ¸(문ìž)를 ëŒë ¤ì¤€ë‹¤. 파ì¼ì˜ ëì— ë„달했거나 오류가 있다면 EOF를 ëŒë ¤ì¤€ë‹¤. -fputc, putc, putchar : fputc는 ë¬¸ìž í•˜ë‚˜ë¥¼ 출력 ìŠ¤íŠ¸ë¦¼ì— ê¸°ë¡í•œë‹¤. 성공 ì‹œ 문ìžì˜ ê°’ì„ ëŒë ¤ì£¼ê³ , 실패 ì‹œ EOF를 ëŒë ¤ì¤€ë‹¤. -fgets, gets : ìž…ë ¥ íŒŒì¼ ìŠ¤íŠ¸ë¦¼ì—ì„œ í•˜ë‚˜ì˜ ë¬¸ìžì—´ì„ ì½ì–´ 들ì¸ë‹¤. Ex) char* fgets(char* s, int n, FILE* stream); char* gets(char* s); ->sê°€ 가리키는 문ìžì—´ì— ë„£ë˜ ìƒˆ 줄 문ìžë¥¼ 만나거나, n-1ê°œì˜ ë¬¸ìžë“¤ì„ ì½ì—ˆê±°ë‚˜, 파 ì¼ì˜ ëì— ë„달하면 멈춘다. 새 줄 문ìžë„ sì— ì €ìž¥ëœë‹¤. *EOF는 End Of Fileì˜ ì•½ìž
  • 13. ï½ ì„œì‹í™”ëœ ìž…ë ¥ê³¼ 출력 -printf, fprintf, sprintf : 서로 다른 형ì‹ì˜ 여러 ì¸ìˆ˜ë“¤ì„ ì„œì‹í™”í•´ì„œ 출력한다. -scanf, fscanf, sscanf : 스트림으로부터 ê°’ë“¤ì„ ì½ê³  ê·¸ê²ƒë“¤ì„ í¬ì¸í„° ë§¤ê°œë³€ìˆ˜ë“¤ì´ ê°€ë¦¬í‚¤ëŠ” ë³€ìˆ˜ë“¤ì— ì§‘ì–´ë„£ëŠ”ë‹¤. -기타 다른 í•¨ìˆ˜ë“¤ë„ ë§Žì§€ë§Œ (표준 스트림 stdin, stdout,stderr ì„ ì‚¬ìš©í•˜ëŠ” 함수들) íŒŒì¼ ìŠ¤íŠ¸ë¦¼ì— ëŒ€í•œ 설정ì´ë‚˜ 위치설정 등ì´ë‹¤.
  • 14. ï½ íŒŒì¼ê³¼ ë””ë ‰í„°ë¦¬ì˜ ìƒì„± ë° ê´€ë¦¬ -파ì¼, ë””ë ‰í„°ë¦¬ì˜ ìƒì„± ë° ê´€ë¦¬ë¥¼ 위한 여러 표준 ë¼ì´ë¸ŒëŸ¬ë¦¬ 함수들과 시스템 호출. -chmod : 시스템 호출로, 파ì¼ì´ë‚˜ ë””ë ‰í„°ë¦¬ì˜ ì ‘ê·¼ ê¶Œí•œì„ ë³€ê²½í•˜ëŠ” ë° ì“°ì¸ë‹¤. -chown : 슈í¼ì‚¬ìš©ìžëŠ” ì´ ì‹œìŠ¤í…œ 호출로 파ì¼ì˜ 소유ìžë¥¼ 변경할 수 있다. -unlink : 파ì¼ì˜ 제거. -mkdir, rmdir : ë””ë ‰í† ë¦¬ì˜ ìƒì„±, 제거. 권한 ì„¤ì •ì€ umaskì— ì˜ì¡´í•œë‹¤. -chdir 와 getcwd : 현재 디렉토리 변경 ì‹œ chdir 시스템 호출. 현재 디렉토리를 알고 ì‹¶ì„ ë•ŒëŠ” getcwd함수 사용. -opendir : 디렉터리를 ì—´ê³  ê·¸ì— ëŒ€í•œ 디렉터리 ìŠ¤íŠ¸ë¦¼ì„ ë§Œë“¬. 성공시 디렉터리 항목 ë“¤ì„ ì½ëŠ”ë° ì‚¬ìš©í•  DIR 구조체를 가리키는 í¬ì¸í„°ë¥¼ ëŒë ¤ì¤€ë‹¤. -readdir : 디렉터리 스트림 ì•ˆì˜ ë‹¤ìŒ ë””ë ‰í„°ë¦¬ í•­ëª©ì— ëŒ€í•œ êµ¬ì¡°ì²´ì˜ í¬ì¸í„°ë¥¼ 반환. -telldir : ë””ë ‰í„°ë¦¬ì˜ ìŠ¤íŠ¸ë¦¼ì˜ í˜„ìž¬ ìœ„ì¹˜ì— í•´ë‹¹í•˜ëŠ” ê°’ì„ ëŒë ¤ì¤€ë‹¤. -seekdir : 주어진 디렉터리 ìŠ¤íŠ¸ë¦¼ì˜ í˜„ìž¬ 디렉터리 항목 위치를 변경한다. -closedir : 디렉터리 ìŠ¤íŠ¸ë¦¼ì„ ë‹«ê³  ê·¸ì— ì—°ê´€ëœ ìžì›ë“¤ì„ 해제한다. 성공 ì‹œ 0 반환.
  • 15. ï½ ì˜¤ë¥˜ì²˜ë¦¬ -strerror : 주어진 오류 ë²ˆí˜¸ì— í•´ë‹¹í•˜ëŠ” 오류 메시지 문ìžì—´ì„ 반환한다. -perror : 오류 번호를 ì§ì ‘ 받는 대신 현재 errnoì— ì„¤ì •ëœ ê°’ì„ ì‚¬ìš©. ï½ /PROC íŒŒì¼ ì‹œìŠ¤í…œ ->ì´ íŒŒì¼ ì‹œìŠ¤í…œì´ ì œê³µí•˜ëŠ” ê²ƒì€ ë“œë¼ì´ë²„들과 ì»¤ë„ ê¸°ëŠ¥. ï½ Fcntl ê³¼ mmap ->fcntlì€ ì €ìˆ˜ì¤€ íŒŒì¼ ì„œìˆ ìžë¥¼ 통해 파ì¼ì„ 좀 ë” ì„¸ë°€í•˜ê²Œ 제어. ->mmap 둘 ì´ìƒì˜ í”„ë¡œê·¸ëž¨ë“¤ì´ ì½ê±°ë‚˜ 쓸 수 있는 메모리 ì˜ì—­ì„ 설정.
  • 16. ï½ í”„ë¡œì„¸ìŠ¤ì™€ 신호ì—ì„œ 다루게 ë  ë¶€ë¶„ â—¦ 프로세스 구조, 종류, ì¼ì • â—¦ 새 프로세스를 시작하는 여러 가지 방법들 â—¦ 부모, ìžì‹, 좀비 프로세스 â—¦ 신호와 ê·¸ 활용 방법 ï½ í”„ë¡œì„¸ìŠ¤ëž€â€¦? â—¦ “하나 ì´ìƒì˜ 스레드들과 ê·¸ ìŠ¤ë ˆë“œë“¤ì— í•„ìš”í•œ 시스템 ìžì›ë“¤ì„ í¬í•¨í•˜ëŠ” í•˜ë‚˜ì˜ ì£¼ì†Œ 공간â€ìœ¼ë¡œ ì •ì˜í•œë‹¤. â—¦ 프로세스를 현재 실행 ì¤‘ì¸ í•˜ë‚˜ì˜ í”„ë¡œê·¸ëž¨ìœ¼ë¡œ 간주.
  • 17. ï½ í”„ë¡œì„¸ìŠ¤ 구조, 종류, ì¼ì •(스케줄ë§) PID 101 CODE ìžë£Œ ë¼ì´ë¸ŒëŸ¬ë¦¬ 파ì¼ë“¤ PID 102 CODE ìžë£Œ ë¼ì´ë¸ŒëŸ¬ë¦¬ 파ì¼ë“¤ code Cë¼ì´ë¸ŒëŸ¬ë¦¬ Treck.txt nene.txt $ grep ìžë£Œ treck.txt $ grep ìžë£Œ nene.txt
  • 18. ï½ í”„ë¡œì„¸ìŠ¤ 보기 í”„ë¡œì„¸ìŠ¤ì˜ ìƒíƒœ 현재 ì‹¤í–‰ì¤‘ì¸ í”„ë¡œì„¸ìŠ¤
  • 19. ï½ ìƒˆ 프로세스 시작 â—¦ System 함수를 ì´ìš©í•œ í”„ë¡œì„¸ìŠ¤ì˜ ì‹œìž‘. 여기선 clear 명령어를 사용했다.
  • 20. ï½ í”„ë¡œì„¸ìŠ¤ ì´ë¯¸ì§€ 대체하기 â—¦ Exec 함수를 ì´ìš©, 새 프로세스를 ë„우지만 프로세스를 ë„우는 ë°©ì‹ì´ë‚˜ 프로그램 ì¸ìˆ˜ë“¤ì„ 제공하는 ë°©ì‹ì€ 서로 다르다. ï‚– System 함수보다 훨씬 íš¨ìœ¨ì  -> 새 í”„ë¡œê·¸ëž¨ì´ ì‹œìž‘ëœ í›„ì—는 ì›ëž˜ì˜ 프로그 ëž¨ì´ ë” ì´ìƒ ì‹¤í–‰ë  í•„ìš”ê°€ 없다는 ì ì—ì„œ system 함수보다 훨씬 효율ì . ï‚– 예) execl(const char* path, const char* arg0, … ,(char*)0); Execlp를 ì´ìš©í•œ ps ax 실행.
  • 21. ï½ í”„ë¡œì„¸ìŠ¤ì˜ ì´ë¯¸ì§€ 복제(fork) â—¦ ë™ì‹œì— 여러 ê¸°ëŠ¥ì„ ìˆ˜í–‰í•˜ê³ ìž í•  ë•Œì—는 ì œ 12장ì—ì„œ 다루는 스 레드를 사용할 ìˆ˜ë„ ìžˆê³ , initì´ í•˜ëŠ” 것처럼 í•œ 프로그램 안ì—ì„œ 완전히 개별ì ì¸ 프로세스를 ìƒì„± í•  ìˆ˜ë„ ìžˆë‹¤. 초기 프로세스 Fork() ì›ëž˜ 프로세스 ì˜ ì‹¤í–‰ 새 프로세스 0ì„ ë¦¬í„´ 새 PID 리턴
  • 22. ï½ Forkí•¨ìˆ˜ì˜ ì±…ì—ì„œì˜ ê°„ë‹¨í•œ 예제 ì¤‘ê°„ì— ëª…ë ¹í”„ë¡¬í”„íŠ¸ê°€ ê»´ìžˆëŠ”ë° ê·¸ ì´ìœ ëŠ” ìžì‹ 프로세스는 여전히 실행 중, 부모프로세스는 ëë‚œ ì´ìœ ì´ë‹¤.
  • 23. ï½ ì¢€ë¹„ 프로세스 â—¦ Fork를 ì´ìš©í•œ 프로세스 ìƒì„±ì€ 유용하나, ì‹¤í–‰ì´ ì¢…ë£Œë˜ì—ˆìœ¼ë‚˜ 부모와 ì˜ ì—°ê´€ê´€ê³„ê°€ ì•„ì§ ë‚¨ì•„ 있는 프로세스를 가리켜서 소멸ëœ(defunct)프 로세스, 좀비 프로세스ë¼ê³  부른다. 실행 ì‹œ ë’¤ì— & 붙여서 백그ë¼ìš´ë“œ ìž‘ì—… 후 부모 프로세스 ë나기 ì „ì— ps 명령어를 실행시켜보면, <defunct> ë¼ê³  나오며, ì´ê²ƒì´ 좀비 프로세스ì´ë‹¤.
  • 24. ï½ ì“°ë ˆë“œ â—¦ 리눅스ì—ì„œ 프로세스보다 ìž‘ì€ ì‹¤í–‰ 단위로 스레드ë¼ëŠ” ê²ƒì´ ìžˆë‹¤. 추후 ch12 ì—ì„œ 다룸. ï½ ì‹ í˜¸(signal) â—¦ 신호는 유닉스와 리눅스 ì‹œìŠ¤í…œì´ ì–´ë–¤ ì¡°ê±´ì— ë”°ë¼ ë°œìƒì‹œí‚¤ëŠ” ì‚¬ê±´ì´ ë‹¤.(event) â—¦ Signalì„ ì´ìš©í•´ì„œ 프로세스를 관리한다. â—¦ ë§Žì€ í•¨ìˆ˜ì™€ 플래그 ê°’ì´ ìžˆì§€ë§Œ ë‚˜ì¤‘ì— ì‚¬ìš©ì‹œ ë ˆí¼ëŸ°ìŠ¤ 하는 ê²ƒì´ ì¢‹ì„ ê±°ë¼ ìƒê°ë¨. â—¦ 몇 가지 예만 설명하고 ë‹¤ìŒ ìž¥ìœ¼ë¡œ.
  • 25. ï½ Signal â—¦ í—¤ë” íŒŒì¼ì€ <signal.h> â—¦ Signal함수, sigaction 함수가 ìžˆëŠ”ë° ë‘˜ 중 sigaction 함수가 ë” íš¨ìœ¨ì„± ì´ ì¢‹ìŒ.(안정성, ì‹ íšŒì„±ì´ ë” ì¢‹ìŒ. ) â—¦ ìžì£¼ ì“°ì´ëŠ” 신호 ï‚– SIGALRM – alarm 함수로 ì„¤ì •ëœ íƒ€ì´ë¨¸ì— ì˜í•´ ë°œìƒ ï‚– SIGHUP – ì—°ê²° ëŠê¸´ 터미ë„ì´ ì œì–´ 프로세스ì—게 보냄 ï‚– SIGINT – ctrl + c ë˜ëŠ” ê·¸ì— í•´ë‹¹í•˜ëŠ” 가로채기 문ìžê°€ ìž…ë ¥ ë¬ì„ ë•Œ ï‚– SIGKILL – 프로세스를 ê°•ì œ ì¢…ë£Œí•˜ê³ ìž í•  ë•Œ. ï‚– SIGPIPE – ì—°ê´€ëœ íŒë…ìžê°€ 없는 파ì´í”„ì— ì“°ê¸° ì‹œë„ ì‹œ ë°œìƒ. ï‚– SIGTERM – killëª…ë ¹ì´ ë³´ë‚´ëŠ” 기본 신호 ï‚– SIGUSR1, SIGUSER2 – í”„ë¡œì„¸ìŠ¤ë“¤ì´ ì„œë¡œ 소통하는 ë° ì“°ìž„ ï‚– SIGCONT – 실행 재개 ï‚– SIGCHLD – ìžì‹ í”„ë¡œì„¸ìŠ¤ì˜ ì¤‘ì§€, 종료 ì‹œ ë°œìƒ.
  • 26. ï½ ì“°ë ˆë“œëž€? â—¦ í•œ í”„ë¡œê·¸ëž¨ì˜ ì—¬ëŸ¬ ê°œì˜ ì‹¤í–‰ ê°€ë‹¥ë“¤ì„ ê°€ë¦¬ì¼œ 쓰레드(thread)ë¼ê³  부른다. â—¦ 좀 ë” ì •í™•í•˜ê²Œ ë§í•˜ìžë©´ 쓰레드란, 프로세스 ì•ˆì˜ í•˜ë‚˜ì˜ ì œì–´ íë¦„ì„ ì˜ë¯¸í•œë‹¤. â—¦ ì“°ë ˆë“œì˜ ìž¥,ë‹¨ì  ï‚– 장ì : ï‚– -ìžë£Œì²˜ë¦¬ëŸ‰ì˜ ì¦ëŒ€, 여러 가지 ì¼ì˜ ë™ì‹œ 처리를 통해 효율성ì¦ê°€ ï‚– -성능 í–¥ìƒ ï‚– -ìžì›ì˜ 효율성 ì¦ê°€. ï‚– 단ì : ï‚– -다중 쓰레드 í”„ë¡œê·¸ëž¨ì˜ êµ¬í˜„ì´ ë‚œì´ë„ê°€ ë†’ìŒ ï‚– -ë””ë²„ê¹…ì´ ì–´ë µë‹¤. ï‚– -다중처리 지ì›í•˜ëŠ” 다중 코어 컴퓨터ì´ì–´ì•¼ 함. ï‚– 다중 쓰레드 í”„ë¡œê·¸ëž¨ì˜ ì˜ˆ) 문서를 편집하는 ë™ì•ˆ 실시간으로 ë¬¸ìž ìˆ˜ 세는 것.
  • 27. ï½ ì²« 번째 다중 쓰레드 프로그램
  • 28. ï½ ì“°ë ˆë“œê°€ 실행할 함수 ï½ -pthread_createì˜ ìš”êµ¬ì— ë”°ë¼, ì´ í•¨ìˆ˜ëŠ” void í¬ì¸í„° 하나를 받고 void í¬ì¸í„°ë¥¼ ëŒë ¤ì¤€ë‹¤. ï½ í—¤ë”íŒŒì¼ <pthread.h> ï½ Int pthread_create(pthread_t* thread, pthread_attr_t* attr, void *(*start_routine)(void*), void* arg); 1.pthread_t 를 가리키는 í¬ì¸í„°, 2. ì“°ë ˆë“œì˜ íŠ¹ì„±, 3. Void를 가리키는 í¬ì¸í„°ë¥¼ 받고 void를 가리키는 í¬ì¸í„°ë¥¼ ëŒë ¤ì£¼ëŠ” í•¨ìˆ˜ì˜ ì£¼ì†Œ 지정
  • 29. ï½ Main 함수 Res!=0 ì¼ ë•ŒëŠ” threadê°€ ìƒì„±ì´ 실패한 것 = exit, 성공 ì‹œ ë‹¤ìŒ printf를 실행. Res ==0 ì¼ ê²½ìš° res = pthread_join(a_thread, &thread_result); 실행.
  • 30. ï½ ë™ê¸°í™” ï½ ë‘ ì“°ë ˆë“œ ì´ìƒì´ ë™ì‹œì— ì‹¤í–‰ë  ë•Œ, 쓰레드 ì‹¤í–‰ì„ ì œì–´í•˜ê³  ì½”ë“œì˜ ìž„ê³„ì˜ì—­ì— ì ‘ 근하기 위한, 즉 좀 ë” ë‚˜ì€ ì“°ë ˆë“œ ì‹¤í–‰ì„ ì œì–´, ì½”ë“œì˜ ìž„ê³„ì˜ì—­ì— 접근하기 위한, 즉 좀 ë” ë‚˜ì€ ì“°ë ˆë“œ 실행 ë™ê¸°í™”를 위한 ì¼ë‹¨ì˜ í•¨ìˆ˜ë“¤ì´ ì¡´ìž¬í•œë‹¤. ï½ -세마í¬ì–´(Semaphore) : 코드ì˜ì—­ ì „í›„ì˜ ê´€ë¬¸ ì—­í• ì„ í•œë‹¤. ï½ -뮤í…스(Mutex) : 코드ì˜ì—­ì„ 보호하기 위한 ìƒí˜¸ ë°°ì œ 수단(Mutual exclusion)으로 ì“°ìž„. ï½ â€»ì„¸ë§ˆí¬ì–´ëŠ” 여러 ê°œì˜ ì“°ë ˆë“œë¥¼ ë™ê¸°í™” í•  ë•Œ 사용하기 좋으며, 뮤í…스는 하나 하나 ì˜ ë™ê¸°í™”를 í•  ë•Œ 좋다. ï½ ê°„ë‹¨í•œ 예제
  • 31. ï½ ì“°ë ˆë“œê°€ 실행할 함수부분. ï½ ê¸€ìž ìˆ˜ë¥¼ 세서 출력하는 함수. ï½ ì„¸ë§ˆí¬ì–´ë¥¼ 기다린 후 ìž…ë ¥ëœ ë¬¸ìžë“¤ì˜ 개수를 ì…ˆ. 세마í¬ì–´ 초기화.(0으로)
  • 32. ï½ End ë¬¸ìž ìž…ë ¥ ì‹œ 종료, FASTìž…ë ¥ ì‹œ Wheee… 출력. End ìž…ë ¥ ì‹œ 쓰레드 종료, 세마í¬ì–´ í•´ì œ. 종료.
  • 34. ï½ ë®¤í…스(Mutex)를 ì´ìš©í•œ ë™ê¸°í™” ï½ ë®¤í…스(Mutex)는 ì¼ì •í•œ 코드 ì˜ì—­ì´ í•œ ë²ˆì— í•˜ë‚˜ì˜ ìŠ¤ë ˆë“œì— ì˜í•´ì„œë§Œ ì‹¤í–‰ë  ìˆ˜ 있ë„ë¡ ê·¸ ì˜ì—­ì„ â€œìž ê·¸ëŠ”â€ ì—­í• ì„ í•œë‹¤.(코드 ì˜ì—­ == 임계ì˜ì—­) ï½ í•´ë‹¹ì˜ì—­ì˜ ë™ì‹œì ‘ê·¼ì„ ë§‰ëŠ”ë‹¤. ï½ #include <pthread.h> Int pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t* Mutexattr); - 뮤í…ìŠ¤ì˜ ì´ˆê¸°í™” Int pthread_mutex_lock(pthread_mutex_t* mutex); - 뮤í…스 잠금 Int pthread_mutex_unlock(pthread_mutex_t* mutex); - 뮤í…스 í•´ì œ Int pthread_mutex_destroy(pthread_mutex_t* mutex); - 뮤í…스 ì‚­ì œ *ë™ê¸°í™”ì— ëŒ€í•œ ë¶€ë¶„ì€ ì„¸ë§ˆí¬ì–´ì™€ 뮤í…스를 통한 ê¸°ë²•ì´ ìžˆë‹¤ ì •ë„만 있으면 ëœë‹¤. *ì°¨í›„ì— í”„ë¡œê·¸ëž˜ë° ì‹œ ì ìš©í•  때는 ê° í•¨ìˆ˜ë¥¼ ë ˆí¼ëŸ°ìŠ¤í•˜ì—¬ 사용.
  • 35. ï½ ì“°ë ˆë“œì˜ íŠ¹ì„± ï½ ì“°ë ˆë“œì˜ íŠ¹ì„±(attribute) â—¦ 가장 중요한 함수는 쓰레드 특성 ê°ì²´ë¥¼ 초기화하는 pthread_attr_init ì´ë‹¤. ì´ í•¨ìˆ˜ëŠ” 성공 ì‹œ 0ì„, 실패 ì‹œ -1ì„ ë°˜í™˜í•œë‹¤. ï½ ì“°ë ˆë“œì˜ íŠ¹ì„±ë“¤ â—¦ Detachedstate : ì´ íŠ¹ì„±ì€ ì“°ë ˆë“œì˜ ìž¬ê²°í•© 가능 여부를 결정한다. â—¦ Schedpolicy : ì“°ë ˆë“œì˜ ì¼ì • 관리 ë°©ì‹ì„ 결정한다.(scheduling) â—¦ Schedparam : schedpolicy ì— ì¶”ê°€ì ì¸ 정보를 제공한다. â—¦ Inheritsched : ì“°ë ˆë“œì˜ ìŠ¤ì¼€ì¤„ë§ ë°©ì‹ì— 대해 설명한다.(해당특성 or 쓰레드를 만든 ì“°ë ˆë“œì˜ ë°©ì‹) â—¦ Scope : ì“°ë ˆë“œì˜ ìŠ¤ì¼€ì¤„ë§ì„ 계산하는 ë°©ì‹ì„ ê²°ì •.(리눅스는 PTHREAD_SCOPE_SYSTEM만 지ì›) â—¦ Stacksize : 쓰레드 ìƒì„± ìŠ¤íƒ í¬ê¸° ê²°ì •.
  • 36. ï½ ì“°ë ˆë“œì˜ ì·¨ì†Œ â—¦ í•œ 프로세스가 다른 프로세스ì—게 신호를 ë³´ë‚´ì„œ 종료를 요청하듯, í•œ 쓰레드가 다른 ì“°ë ˆë“œì— ê²Œ 실행종료를 요청해야 하는 경우가 있다. ì´ ë•Œ ì“°ì´ëŠ” 함수는 int pthread_cancel(pthread_t thread); // 유ì¼í•œ ì¸ìˆ˜ëŠ” ì“°ë ˆë“œì˜ ì‹ë³„ìžì´ë‹¤. ê·¸ì „ì— ì·¨ì†Œ ìƒíƒœë¥¼ 결정해야 í•˜ëŠ”ë° ê·¸ 함수는 Int pthread_setcancelstate(int state, int* oldstate); *ìžì„¸í•œ ìƒí•­ì€ ë”°ë¡œ 참조해서 ë³´ëŠ”ê²ƒì´ ì¢‹ë‹¤.
  • 37. ï½ ë‘ ê°œ ì´ìƒì˜ 쓰레드 ï½ ì—¬ëŸ¬ ê°œì˜ ìƒˆ ì“°ë ˆë“œë“¤ì„ ìƒì„±í•´ì„œ ë™ì‹œì— 실행하는 예 ì´ í”„ë¡œê·¸ëž¨ì„ ì‹¤í–‰ì‹œí‚¤ë©´ 나오는 화면ì€â€¦
  • 38. ï½ ì‹¤í–‰í™”ë©´ *ì±…ì—서는 ‘sleep함수를 없애고 í•´ë³´ë©´ ì¼ë¶€ ì“°ë ˆë“œë“¤ì´ ê°™ì€ ì¸ìˆ˜ë“¤ë¡œ 시작ë˜ëŠ” ì´ìƒí•œ 현ìƒì´ 빚어진다’ 나온다. ì´ì— 대한 문제는 쓰레드가 빠르게 실행ë˜ëŠ” 경우 ì¼ë¶€ 쓰레드는 ìƒˆë¡œì´ ê°±ì‹ ëœ ì§€ì—­ë³€ìˆ˜ì˜ ê°’ì„ ë°›ê²Œ ë˜ê³ , 그래서 ê°™ì€ ë²ˆí˜¸ë¥¼ 가진 쓰레드가 ìƒê¸°ëŠ” 것. ->주소 값으로 받지ë§ê³  ë³€ìˆ˜ì˜ ê°’ì„ ìŠ¤ë ˆë“œ í•¨ìˆ˜ì— ì „ë‹¬í•´ì•¼ 한다.
  • 39. ï½ ìš”ì•½ â—¦ ì´ë²ˆìž¥ì—서만 ìš”ì•½ì„ ì“°ëŠ” ì´ìœ ëŠ” ê·¸ë§Œí¼ ì“°ë ˆë“œê°€ 중요해서ì´ë‹¤. â—¦ 쓰레드는 í”„ë¡œì„¸ìŠ¤ì˜ ë‹¨ì ì„ 보완해줄 수 있으며, 여러방면ì—ì„œ 유용하다. 하지만 êµ¬í˜„ì´ ì–´ë µë‹¤ëŠ”ê²Œ 단ì ì´ë©°, 멀티 프로세스ì—ì„œì˜ ë¬¸ì œì ì¸ ë™ì‹œ 실행 문제나 ë™ì‹œ ì ‘ê·¼ì˜ ë¬¸ì œë¥¼ 가지 ê³  있다. 윈ë„우즈 시스템 프로그래ë°ì—서와 비슷하지만 함수관련하여 변수나 다른 부분만 다르지 ê°œë…ì€ ê°™ë‹¤. ì±…ì—ì„œì˜ ì„¤ëª…ì€, í•œ 프로세스 안ì—ì„œ 여러 ê°œì˜ ì“°ë ˆë“œë“¤ì„ ìƒì„±í•˜ëŠ” ë°©ë²•ì— ëŒ€í•´ì„œ 살펴 보았고, 그러한 쓰레드 ë“¤ì€ íŒŒì¼ ë²”ìœ„ ë³€ìˆ˜ë“¤ì„ í•¨ê»˜ 공유한다. ë˜ ê·¸ 공유하는 ë¶€ë¶„ì— ëŒ€í•´ì„œ 세마í¬ì™€ 뮤í…스를 ì´ ìš©, 임계ì˜ì—­ì´ë‚˜ ìžë£Œì— 대한 ì“°ë ˆë“œì˜ ì ‘ê·¼ì„ ì œì–´í•˜ëŠ” ê²ƒë„ ë³´ì•˜ë‹¤.
  • 40. ï½ IPC : InterProcesscommunicationë¡œ 프로세스간 통신 ì„ ì˜ë¯¸í•˜ë©° ê·¸ 중 파ì´í”„ê°€ 있다. ï½ íŒŒì´í”„(Pipe) : ë‘ í”„ë¡œì„¸ìŠ¤ 사ì´ì˜ ìžë£Œ í름 통로를 제공 하는 수단. ì¼ë°˜ì ìœ¼ë¡œ 파ì´í”„는 í•œ í”„ë¡œì„¸ìŠ¤ì˜ ì¶œë ¥ì„ ë‹¤ë¥¸ í”„ë¡œì„¸ìŠ¤ì˜ ìž…ë ¥ì— ì—°ê²°í•˜ëŠ” ìš©ë„ë¡œ ì“°ì¸ë‹¤. -popen, pclose – ë‘ í”„ë¡œê·¸ëž¨ì´ ìžë£Œë¥¼ 주고 받는 가장 간단한 ë°©ë²•ì˜ í•¨ìˆ˜. -pipe 함수 : ìœ„ì˜ popen, pclose 보다 ì €ìˆ˜ì¤€ì˜ í•¨ìˆ˜ë¡œ pipe를 사용 ì‹œ fread 나 fwrite ê°™ì€ í•¨ìˆ˜ë“¤ì´ ì•„ë‹ˆë¼ read, write ê°™ì€ ì €ìˆ˜ì¤€ 시스템 호 ì¶œë“¤ì„ ì‚¬ìš©í•´ì•¼ 한다. *pipe는 나중ì—… 중요ë„ê°€ í¬ì§€ 않으므로…
  • 41. ï½ ëª…ëª…ëœ íŒŒì´í”„ :FIFO â—¦ Named pipe(ëª…ëª…ëœ íŒŒì´í”„, ì´ë¦„있는 파ì´í”„) â—¦ ìžì‹í”„로세스와 부모프로세스 ê´€ê³„ì˜ íŒŒì¼, ë°ì´í„° 주고 받는 것과 달리, 서로 ì—°ê´€ë˜ì§€ ì•Šì€ í”„ë¡œì„¸ìŠ¤ë“¤ë¼ë¦¬ ìžë£Œë¥¼ 주고 ë°›ì„ ìˆ˜ 있게 하는 파ì´í”„ ì±…ì—ì„œ 서버 & í´ë¼ì´ì–¸íŠ¸ì™€ì˜ ì—°ê²°ì„ FIFOë¡œ 구현하였으며 ë°ì´í„°ë² ì´ìŠ¤ì™€ì˜ ì—°ê²° ë˜í•œ FIFOë¡œ êµ¬í˜„í–ˆëŠ”ë° í›„ì— ì†Œì¼“ìœ¼ë¡œ 구현하는 ë°©ë²•ì´ ë§Žì´ ì‚¬ìš©ë˜ë‹ˆ í›„ì— ì†Œì¼“ì„ ìžì„¸ížˆ 공부하기로 했다.
  • 42. ï½ ì„¸ë§ˆí¬(semaphore)란? â—¦ í•˜ë‚˜ì˜ ìžì›ì— 단 í•˜ë‚˜ì˜ í”„ë¡œì„¸ìŠ¤(ë˜ëŠ” 프로세스)ë§Œì´ ì ‘ê·¼í•¨ì„ ë³´ìž¥í•´ì•¼ 하는 코드 ì˜ì—­ì´ 있는ë°, 그런 ì˜ì—­ì„ 임계 ì˜ì—­(critical section)ì´ë¼ê³  부른다. 여러 í”„ë¡œê·¸ëž¨ë“¤ì´ í•˜ë‚˜ì˜ ê³µìœ  ìžì›ì— ë™ì‹œì— 접근할 ë•Œ ë°œìƒí•˜ëŠ” 문제를 방지하 려면 í•œ ë²ˆì— ë‹¨ í•˜ë‚˜ì˜ ì‹¤í–‰ 쓰레드만 í•˜ë‚˜ì˜ ìž„ê³„ì˜ì—­ì— 접근할 수 있ë„ë¡ ì¼ì¢… ì˜ í† í°ì„ ìƒì„±, 부여하는 ìˆ˜ë‹¨ì´ í•„ìš”í•˜ë‹¤. 세마í¬ë¥¼ ì´ìš©, 임계 ì˜ì—­ì— 접근하는 ê²ƒì„ í†µì œ, ë™ê¸°í™” 한다. 세마í¬ëŠ” ì˜¤ì§ ëŒ€ê¸°(wait), 신호(signal) ë¼ëŠ” ë‘ ê°€ì§€ ì—°ì‚°ë§Œì´ ê°€ëŠ¥í•œ 특별한 ë³€ 수ë¼ê³  í•  수 있다. ex) 가장 간단한 세마í¬ëŠ” ì´ì§„ 세마í¬ì¸ë° 0, 1 ê°’ ë§Œì„ ê°€ì§„ë‹¤.
  • 43. ï½ ì„¸ë§ˆí¬ì˜ 사용 â—¦ ì±…ì—서는 semaphore_p, semaphore_v 함수를 만들어서, semaphore_p는 ì„¸ë§ˆí¬ ê°’ì„ -1 ë§Œí¼ ë³€ê²½í•˜ê²Œ 하며(대기) semaphore_v는 ì„¸ë§ˆí¬ ê°’ì„ +1 ë§Œí¼ ë³€ê²½í•˜ê²Œ 하여(신호) 임계ì˜ì—­ì— 들어갈 때는 semaphore_p를, 나올 때는 semaphore_v를 호출하여 임계 ì˜ì—­ì— 대한 ì ‘ê·¼ì„ ë™ê¸°í™”한다. ì´ í•¨ìˆ˜ë“¤ì€ ì¢€ ë” ì¼ë°˜ì ì¸ semop 함수를 단순화한 ì¸í„°íŽ˜ì´ìŠ¤ë‹¤. 세마í¬ë¥¼ 사용한 후ì—는 삭제하는 ê²ƒì´ ì¢‹ì€ë°, í”„ë¡œê·¸ëž¨ì„ ë‹¤ìŒì— 다시 실행할 ë•Œ 문제가 ìƒê¸¸ 수 있기 때문ì´ë‹¤.
  • 44. ï½ ê³µìœ  메모리(Shared Memory) â—¦ IPC 수단ì´ë©°, 서로 무관한 ë‘ í”„ë¡œì„¸ìŠ¤ê°€ ë™ì¼í•œ ë…¼ë¦¬ì  ë©”ëª¨ë¦¬ ì˜ì—­ì— 접근할 수 있게 한다. 공유 메모리를 ì´ìš©í•˜ë©´ 실행 ì¤‘ì¸ ë‘ í”„ë¡œì„¸ìŠ¤ê°€ ìžë£Œë¥¼ 아주 효율ì ì¸ ë°©ì‹ìœ¼ë¡œ ì£¼ê³ ë°›ì„ ìˆ˜ 있다. IPCê°€ í•œ 프로세스를 위해 ìƒì„±í•œ 공유 메모리는 ê·¸ í”„ë¡œì„¸ìŠ¤ì˜ ì£¼ì†Œ 공간ì—ì„œ 특 ì • 범위를 차지한다. 공유 메모리는 여러 í”„ë¡œì„¸ìŠ¤ë“¤ì´ ìžë£Œë¥¼ 공유하고 주고받는 효율ì ì¸ ìˆ˜ë‹¨ì´ ëœ ë‹¤. ì´ ë•Œ, 공유 메모리 ìžì²´ëŠ” ë™ê¸°í™” ìˆ˜ë‹¨ì„ ì œê³µí•˜ì§€ ì•Šì•„ì„œ 해당 í”„ë¡œê·¸ëž¨ì´ ì±… 임져야 한다. *함수) -shmget : 공유 메모리 ìƒì„± /변수 : (key_t key,size_t size,int shmflg) -shmat : í”„ë¡œì„¸ìŠ¤ì˜ ì£¼ì†Œê³µê°„ì— ë¶€ì°© -shmdt : 공유 메모리를 현재 프로세스ì—ì„œ 떼어낸다.(detach) -shmctl : 공유 메모리를 제어하는 ìš©ë„(공유메모리 ì‹ë³„ìž, 명령, ê³µìœ ë©”ëª¨ë¦¬ì˜ ëª¨ 드들과 ê¶Œí•œë“¤ì„ ë‹´ì€ êµ¬ì¡°ì²´ í¬ì¸í„°)
  • 45. ï½ ë©”ì‹œì§€ í(Message queue) â—¦ IPCì˜ í•œ 방법으로 ëª…ëª…ëœ íŒŒì´í”„와 여러모로 비슷한 반면, 파ì´í”„를 ì—´ê³  닫는 ë° ê´€ë ¨ëœ ë²ˆìž¡í•¨ì´ ì—†ë‹¤. 그러나 꽉 ì°¬ 파ì´í”„ì— ì˜í•œ 실행 차단 등 ëª…ëª…ëœ íŒŒì´í”„ì— ì„œ ë°œìƒí•  수 있는 ë¬¸ì œë“¤ì€ ë©”ì‹œì§€ íì—ë„ ì—¬ì „ížˆ 존재한다. 메시지 í를 ì´ìš©í•˜ë©´ 서로 무관한 ë‘ í”„ë¡œì„¸ìŠ¤ê°€ ìžë£Œë¥¼ ìƒë‹¹ížˆ 쉽고 효율ì ìœ¼ë¡œ 주고 ë°›ì„ ìˆ˜ 있다. ëª…ëª…ëœ íŒŒì´í”„와 달리 메시지 í는 전송 프로세스와 수신 프로 세스 모ë‘ì— ë…립ì ìœ¼ë¡œ 존재한다. ì´ ë•ë¶„ì— íŒŒì´í”„ì—ì„œ 열기와 닫기를 ë™ê¸°í™”í•  ë•Œ ìƒê¸°ëŠ” ì–´ë ¤ì›€ì„ í”¼í•  수 있다. -í•œ 프로세스가 다른 프로세스ì—게 ìžë£Œ 블ë¡ì„ 전달하는 수단. ê° ìžë£Œ 블ë¡ì´ ìžì‹ ì˜ 종류를 구분하는 ê°’ì„ ê°€ì§€ê³  있어서 수신 프로세스는 서로 다른 ì¢…ë¥˜ì˜ ìžë£Œ 블ë¡ë“¤ì„ ë…립ì ìœ¼ë¡œ ë°›ì„ ìˆ˜ 있고, 처리가 복잡해질 수 있다. ë˜ íŒŒì´í”„와 마찬가지로 ê° ìžë£Œ 블ë¡ì˜ í¬ê¸°ì—는 ìƒí•œì´ 존재하며, 시스템 ì „ë°˜ì˜ ëª¨ë“  ëŒ€ê¸°ì—´ì— ë‹´ì„ ìˆ˜ 있는 블ë¡ë“¤ì˜ ì „ì²´ í¬ê¸°ì—ë„ ìƒí•œì´ 존재한다.
  • 46. ï½ ë©”ì‹œì§€ í 함수 â—¦ #include <sys/msg.h> int msgctl(int msgid, int cmd, struct msgid_ds* buf); int msgget(key_t key, int msgflg); int msgrcv(int msgid, void* msg_ptr, size_t msg_sz, long int msgtype, int msgflg); int msgsnd(int msgid, const void* msg_ptr, size_t msg_sz, int msgflg); <함수> Msgget : 메시지 íì— ì ‘ê·¼í•  ë•Œ 사용하는 함수. Msgsnd : 메시지 íì— í•˜ë‚˜ì˜ ë©”ì‹œì§€ë¥¼ 전송할 ë•Œ 사용하는 함수. Msgrcv : 메시지 íì—ì„œ 메시지를 ë°›ì„ ë•Œ 사용하는 함수. Smgctl : 메시지 í를 제어하는 함수. (공유 ë©”ëª¨ë¦¬ì˜ ì œì–´ 함수와 아주 비슷)
  • 47. ï½ ê°ê°ì˜ IPC ìƒíƒœë³´ëŠ” 명령어(í„°ë¯¸ë„ ì°½ì—ì„œ) â—¦ ì„¸ë§ˆí¬ ìƒíƒœ 보기 ï‚– ipcs –s â—¦ 공유 메모리 ìƒíƒœ 보기 ï‚– ipcs –m â—¦ 메시지 í ìƒíƒœ 보기 ï‚– ipcs -q
  • 48. ï½ ì†Œì¼“ì´ëž€..? â—¦ Ch13, 14장ì—ì„œ ë‹¤ë£¨ì—ˆë˜ ê²ƒê³¼ 근본ì ì¸ ì°¨ì´ë¥¼ ë³´ì¸ë‹¤. ì†Œì¼“ì— ì„œëŠ” 여러 ì»´í“¨í„°ë“¤ì˜ ê²½ê³„ë¥¼ 넘나들 수 있다. ì†Œì¼“ì˜ ì‚¬ìš© ë°©ë²•ì€ íŒŒì´í”„ 사용 방법과 매우 비슷하지만, 여러 ì»´ í“¨í„°ë“¤ì˜ ë„¤íŠ¸ì›Œí¬ë¥¼ 가로질러서 ìžë£Œë¥¼ ì£¼ê³ ë°›ì„ ìˆ˜ 있는 능력 ì€ ì†Œì¼“ì—만 해당ëœë‹¤. í•œ ì»´í“¨í„°ì˜ í”„ë¡œì„¸ìŠ¤ëŠ” ì†Œì¼“ì„ í†µí•´ì„œ 다 른 ì»´í“¨í„°ì˜ í”„ë¡œì„¸ìŠ¤ì™€ 통신할 수 있으며, ì´ë¥¼ 통해서 ë„¤íŠ¸ì›Œí¬ ìƒì— ë¶„ì‚°ëœ í´ë¼ì´ì–¸íŠ¸/서버 ì‹œìŠ¤í…œì„ êµ¬ì¶•í•  수 있다. ex) ì›ê²© ì¸ì‡„, ë°ì´í„°ë² ì´ìŠ¤ ì—°ê²°, 웹 서버 기능 등. â—¦ *소켓 ì¸í„°íŽ˜ì´ìŠ¤ëŠ” Windowsë„ ì§€ì›í•˜ë©°, 윈ì†(WinSock)ì´ë¼ê³  부른다.
  • 49. ï½ ì£¼ì œ â—¦ 소켓 ì—°ê²°ì˜ ìž‘ë™ ë°©ì‹ â—¦ ì†Œì¼“ì˜ íŠ¹ì„±ë“¤ê³¼ 주소, 통신 â—¦ ë„¤íŠ¸ì›Œí¬ ì •ë³´ì™€ ì¸í„°ë„· ë°ëª¬ â—¦ í´ë¼ì´ì–¸íŠ¸ì™€ 서버
  • 50. ï½ ì†Œì¼“ ì—°ê²° â—¦ 1. 서버 ì‘ìš©í”„ë¡œê·¸ëž¨ì´ ì†Œì¼“ì„ ìƒì„±í•œë‹¤. 서버는 시스템 호출 socketì„ ì´ìš©, 소 ì¼“ì„ ìƒì„±.(ì´ ì†Œì¼“ì€ ë‹¤ë¥¸ 프로세스와 공유ë˜ì§€ 못한다. â—¦ 2.서버 프로세스는 ê·¸ ì†Œì¼“ì— í•˜ë‚˜ì˜ ì´ë¦„ì„ ë¶€ì—¬í•œë‹¤. ë„¤íŠ¸ì›Œí¬ ì†Œì¼“ì˜ ê²½ìš° í´ë¼ ì´ì–¸íŠ¸ê°€ ì—°ê²°í•  수 있는 특정 네트워í¬ì— ê´€ë ¨ëœ ì„œë¹„ìŠ¤ ì‹ë³„ìžê°€ 부여ëœë‹¤. ì†Œì¼“ì— ì´ë¦„ì„ ë¶€ì—¬í•  ë•Œ 사용하는 시스템 í˜¸ì¶œì€ bind ì´ë‹¤. ì´ë¦„ì„ ë¶€ì—¬í•œ 후, 서버 프로세스는 해당 ì†Œì¼“ì— í´ë¼ì´ì–¸íŠ¸ê°€ ì—°ê²°ë˜ê¸°ë¥¼ 기다린다. ì´ë¥¼ 위한 시스 í…œ í˜¸ì¶œì€ listenì´ë©°, ì´ í•¨ìˆ˜ëŠ” 들어오는 ì—°ê²°ì„ ìœ„í•œ ëŒ€ê¸°ì—´ì„ ìƒì„±í•œë‹¤. ì—°ê²° ìš”ì²­ì´ ë“¤ì–´ì˜¤ë©´ 서버는 시스템 호출 accept를 ì´ìš©í•´ì„œ ê·¸ ìš”ì²­ì„ ë°›ì•„ë“¤ì¸ë‹¤. 서버가 accept를 호출하면, ëª…ëª…ëœ ì†Œì¼“ê³¼ëŠ” 개별ì ì¸ 새로운 ì†Œì¼“ì´ ìƒì„±ëœë‹¤. ì´ ìƒˆ ì†Œì¼“ì€ í•´ë‹¹ í´ë¼ì´ì–¸íŠ¸ í•˜ë‚˜ì™€ì˜ í†µì‹ ì—만 ì“°ì¸ë‹¤. -í´ë¼ì´ì–¸íŠ¸ ìª½ì˜ ì†Œì¼“ 기반 ì‹œìŠ¤í…œì€ í›¨ì”¬ 간단하다. í´ë¼ì´ì–¸íŠ¸ëŠ” socketì„ í˜¸ì¶œí•´ì„œ ì´ë¦„없는 ì†Œì¼“ì„ ìƒì„±, ê·¸ 다ìŒì—는 ì„œë²„ì˜ ëª…ëª…ëœ ì†Œì¼“ì„ ì£¼ì†Œë¡œ 사용해 connect를 í˜¸ì¶œí•¨ìœ¼ë¡œì¨ ì„œë²„ì™€ì˜ ì—°ê²°ì„ ë§Œë“ ë‹¤.
  • 51. ï½ ì†Œì¼“ 특성들. â—¦ ì†Œì¼“ì„ ê·œì •í•˜ëŠ” 가장 중요한 특성 세 가지는 ë„ë©”ì¸, 종류, 프로토콜 ì´ë‹¤. â—¦ ì†Œì¼“ì€ ë˜í•œ 주소로 ì“°ì´ëŠ” ì´ë¦„ë„ ê°€ì§€ëŠ”ë°, ì£¼ì†Œì˜ í˜•ì‹ì€ ë„ë©”ì¸ì— ë”°ë¼ ë‹¤ë¥´ë‹¤. â—¦ ë„ë©”ì¸ì„ 프로토콜 패밀리ë¼ê³  ë¶€ë¥´ê¸°ë„ í•œë‹¤. â—¦ 소켓 ë„ë©”ì¸. ï‚– ë„ë©”ì¸ì€ 소켓 í†µì‹ ì´ ì‚¬ìš©í•  ë„¤íŠ¸ì›Œí¬ ë§¤ì²´ë¥¼ 결정한다. 가장 í”히 ì“°ì´ëŠ” 소켓 ë„ë©”ì¸ì€ AF_INET으로, ì´ê²ƒì€ ì¸í„°ë„· ìžì²´ëŠ” 물론 여러 리눅스 근거리 통신ë§ì—ë„ ì“°ì´ëŠ” ì¸í„°ë„· ë„¤íŠ¸ì›Œí‚¹ì— í•´ë‹¹í•œë‹¤. ì´ ë„ë©”ì¸ì˜ 프로토콜 패밀리는 ì¸í„°ë„· 프로토콜(IP)ì´ë‹¤. ì¸í„°ë„· 프로토콜ì—ì„œ 네트워í¬ìƒì˜ 특정한 컴퓨터를 지칭하는 ë° ì“°ì´ëŠ” 주소 형ì‹ì€ IP주소 하나ë¿ì´ë‹¤
  • 52. ï½ ì†Œì¼“ì˜ ì¢…ë¥˜ â—¦ 스트림 소켓 ï‚– 표준 ìž…, 출력 스트림과 다소 비슷한 ë©´ì„ ê°€ì§„ 스트림 ì†Œì¼“ì€ ìˆœì°¨ì ì¸, 그리고 신뢰성 있 는 ì–‘ë°©í–¥ ë°”ì´íŠ¸ 스트림 ë°©ì‹ì˜ ì—°ê²°ì„ ì œê³µí•œë‹¤.(신뢰성 : ì „ì†¡ëœ ìžë£Œê°€ 오류가 ë³´ê³ ë˜ì§€ ì•Šê³  소실ë˜ê±°ë‚˜, 복제ë˜ê±°ë‚˜, 순서가 바뀌는 ì¼ì€ 없다는 뜻) â—¦ ë°ì´í„°ê·¸ëž¨ 소켓 ï‚– ì—°ê²°ì˜ ìœ ì§€ ë° ê´€ë¦¬ë¥¼ 수행하지 않는다. ë˜í•œ ì´ ì¢…ë¥˜ì˜ ì†Œì¼“ì—ì„œ 보낼 수 있는 í•˜ë‚˜ì˜ ë° ì´í„°ê·¸ëž¨ì˜ í¬ê¸°ì—는 한계가 주어져 있다. ë°ì´í„°ê·¸ëž¨ì€ ë„ì¤‘ì— ì†Œì‹¤ë˜ê±°ë‚˜, 중복ë˜ê±°ë‚˜, 다른 ë°ì´í„°ê·¸ëž¨ê³¼ 순서가 바뀔 수 있다. (UDP/IP ì—°ê²°ì„ í†µí•´ 구현ëœë‹¤.) ï‚– 순차성과 ì‹ ë¢°ì„±ì„ ë³´ìž¥í•˜ì§„ 않지만, ë„¤íŠ¸ì›Œí¬ ì—°ê²°ì„ ìœ ì§€í•  필요가 없기 ë•Œë¬¸ì— ìžì› 효 ìœ¨ì„±ì´ ì¢‹ë‹¤. ì—°ê²° ì„¤ì •í•˜ëŠ”ë° ì†Œìš” ì‹œê°„ì´ ì—†ê¸° ë•Œë¬¸ì— ì†ë„ë„ ë¹ ë¥´ë‹¤. â—¦ 소켓 프로토콜 ï‚– 소켓 ì¢…ë¥˜ì˜ ì „ì†¡ ë©”ì»¤ë‹ˆì¦˜ì´ ì—¬ëŸ¬ ê°œì˜ í”„ë¡œí† ì½œë“¤ì„ ì œê³µí•˜ëŠ” 경우 í”„ë¡œê·¸ëž¨ì€ ê·¸ 중 하 나를 ì„ íƒí•  수 있다. ì±…ì—서는 다른 소켓 í”„ë¡œí† ì½œì€ ì‚¬ìš©í•˜ì§€ 않았다.
  • 53. ï½ ì†Œì¼“ ìƒì„± â—¦ int socket(int domain, int type, int protocol); ï‚– domain ì€ ì†Œì¼“ì˜ ì£¼ì†Œ 패밀리를 ê²°ì • ï‚– type 는 ì†Œì¼“ì— ì“°ì¼ í†µì‹ ì˜ ì¢…ë¥˜ë¥¼ ê²°ì •. ï‚– protocolì€ ê·¸ í†µì‹ ì„ ìœ„í•œ í”„ë¡œí† ì½œì„ ê²°ì •. ï‚– Socket 시스템 í˜¸ì¶œì€ í•˜ë‚˜ì˜ ì„œìˆ ìžë¥¼ ëŒë ¤ì£¼ëŠ”ë°, ì´ê²ƒì€ 저수준 파 ì¼ ì‹œìŠ¤í…œ 서술ìžì™€ 여러모로 비슷하다. ï‚– ì†Œì¼“ì´ ì—°ê²°ë˜ë©´ ì´ ì„œìˆ ìžë¡œ 시스템 호출 read, write를 호출, ìžë£Œë¥¼ ì½ê±°ë‚˜ 쓸 수 있다. 소켓 ì—°ê²°ì„ ë낼 ë•Œì—는 close 사용.
  • 54. ï½ ì†Œì¼“ ì´ë¦„ 붙ì´ê¸° â—¦ int bind(int socket, const struct sockaddr* address, size_t address_len); ï‚– Bind 시스템 í˜¸ì¶œì€ socket 변수로 ì§€ì •ëœ ì´ë¦„ 없는 ì†Œì¼“ì— address 매개변수 ë¡œ ì§€ì •ëœ ì£¼ì†Œ êµ¬ì¡°ì²´ì— ë‹´ê¸´ 주소를 부여한다. ï‚– Bind를 호출할 ë•Œì—는 특정 주소 구조체 í¬ì¸í„°ë¥¼ 반드시 ì¼ë°˜ì ì¸ 주소 í˜•ì‹ í¬ì¸í„°(struct sockaddr*)ë¡œ ê°•ì œ 형변환해야 한다. ï‚– bind는 성공 ì‹œ 0ì„, 실패 ì‹œ -1ì„ ë°˜í™˜.
  • 55. ï½ ì†Œì¼“ ì—°ê²° 대기열 만들기 â—¦ int listen(int socket, int backlog); ï‚– backlog 변수는 listenì´ ìƒì„±í•  ëŒ€ê¸°ì—´ì˜ í¬ê¸°, 즉 ëŒ€ê¸°ì—´ì— ë‹´ì„ ìˆ˜ 있는 ì—° ê²° ìš”ì²­ë“¤ì˜ ìµœëŒ€ 개수ì´ë‹¤. ï‚– listen함수는 성공 ì‹œ 0ì„, 실패 ì‹œ -1ì„ ëŒë ¤ì¤€ë‹¤.
  • 56. ï½ ì—°ê²° ìˆ˜ë½ â—¦ Int accept(int socket, struct sockaddr* address, size_t* address_len); Accept 시스템 í˜¸ì¶œì€ socket 변수로 ì§€ì •ëœ ì†Œì¼“ì— í´ë¼ì´ì–¸íŠ¸ê°€ ì—°ê²°ì„ ì‹œë„하길 기다린다. ê·¸ í´ë¼ì´ì–¸íŠ¸ëŠ” ì†Œì¼“ì˜ ëŒ€ê¸°ì—´ì˜ ì²« 번째 ì—°ê²° ìš”ì²­ì— í•´ë‹¹í•œë‹¤. accept는 ê·¸ í´ë¼ì´ì–¸íŠ¸ì˜ í†µì‹ ì„ ìœ„í•œ 새 ì†Œì¼“ì„ ìƒì„±í•œ 후 ê·¸ê²ƒì˜ ì„œìˆ ìžë¥¼ 반환 한다. 새 ì†Œì¼“ì€ ì„œë²„ì˜ ì²­ì·¨ 소켓과 ê°™ì€ ì¢…ë¥˜ì´ë‹¤. - socket 변수ì—는 반드시 bindë¡œ 명명, listen으로 ëŒ€ê¸°ì—´ì„ ë§Œë“  ì†Œì¼“ì˜ ì„œìˆ ìžë¥¼ 지정해야 한다. -address 변수가 가리키는 ê³³ì—는 ì—°ê²°ëœ í´ë¼ì´ì–¸íŠ¸ì˜ 주소 구조체가 설정ëœë‹¤. -address_len 변수ì—는 í´ë¼ì´ì–¸íŠ¸ 주소 êµ¬ì¡°ì²´ì˜ ê¸¸ì´ë¥¼ ë‹´ì€ ë³€ìˆ˜ì˜ ì£¼ì†Œ 설정. *ì†Œì¼“ì˜ ëŒ€ê¸°ì—´ì— ì—°ê²° ìš”ì²­ì´ í•˜ë‚˜ë„ ì—†ìœ¼ë©´ accept í˜¸ì¶œì´ ì°¨ë‹¨ë˜ë©°, í´ë¼ì´ì–¸íŠ¸ ê°€ ì—°ê²°ì„ ìš”ì²­í•˜ë©´ 비로소 서버 í”„ë¡œì„¸ìŠ¤ì˜ ì‹¤í–‰ì´ ìž¬ê°œëœë‹¤
  • 57. ï½ ì—°ê²° 요청 â—¦ int connect(int socket, const struct sockaddr* address, size_t address_len); ï‚– Socket 변수는 í´ë¼ì´ì–¸íŠ¸ìª½ ì†Œì¼“ì˜ ì„œìˆ ìžì´ê³  address는 서버쪽 ì†Œì¼“ì˜ ì£¼ 소를 ë‹´ì€ êµ¬ì¡°ì²´ë¥¼ 가리킨다. ï‚– Address_lenì€ ê·¸ êµ¬ì¡°ì²´ì˜ ê¸¸ì´ì´ë‹¤. ï‚– Socket변수ì—는 반드시 socket 호출로 ì–»ì€ ìœ íš¨í•œ 서술ìžë¥¼ 지정해야한다. ï‚– connect는 성공시 0, 실패시 -1ì„ ëŒë ¤ì¤€ë‹¤. ï½ ì†Œì¼“ 닫기 â—¦ Close를 호출해서 ì†Œì¼“ì—°ê²°ì„ ë낼 수 있다.
  • 58. ï½ ë‹¤ì¤‘ í´ë¼ì´ì–¸íŠ¸ â—¦ í•˜ë‚˜ì˜ ì„œë²„ì— ì—¬ëŸ¬ ê°œì˜ í´ë¼ì´ì–¸íŠ¸ë“¤ì´ ë™ì‹œì— 연결하 는 경우. ï‚– 서버 프로그램 측ì—ì„œ fork를 ì´ìš©, 다중 í´ë¼ì´ì–¸íŠ¸ë¥¼ 처리할 ìˆ˜ë„ ìžˆ 으며 select 함수를 ì´ìš©í•˜ì—¬ 처리 í•  ìˆ˜ë„ ìžˆë‹¤. ï‚– 여기서 select란, 시스템 í˜¸ì¶œë¡œì¨ ì €ìˆ˜ì¤€ íŒŒì¼ ì„œìˆ ìžë“¤ì„ í•˜ë‚˜ì˜ ë‹¨ 위로 취급해서 그것들 중 í•˜ë‚˜ì— ìž…ë ¥ì´ ë“¤ì–´ì˜¤ê¸°ë¥¼(ë˜ëŠ” ì¶œë ¥ì´ ì™„ë£Œ ë˜ê¸¸) 기다릴 수 있다. 만약 다중 í´ë¼ì´ì–¸íŠ¸ì—ì„œ 사용한다면, 서버 쪽 ì²­ì·¨ 소켓과 í´ë¼ì´ì–¸íŠ¸ ì—°ê²° 소켓 모ë‘를 ë™ì‹œì— 기다린다. 둘 중 하 나ë¼ë„ 활ë™ì´ ê°ì§€ë˜ë©´, 모든 가능한 íŒŒì¼ ì„œìˆ ìžë¥¼ ì ê²€, ì–´ë–¤ 소켓 ì´ ê¹¨ì–´ë‚¬ëŠ”ì§€ 파악, ê·¸ì— ë”°ë¼ ì ì ˆí•œ 처리를 수행한다. ï‚– 서버 쪽 ì²­ì·¨ ì†Œì¼“ì— ìž…ë ¥ì´ ë“¤ì–´ì™”ë‹¤ë©´ ì–´ë–¤ í´ë¼ì´ì–¸íŠ¸ê°€ ì„œë²„ì™€ì˜ ì—°ê²°ì„ ì‹œë„í•œ 것ì´ë‹¤. ì´ ê²½ìš° ì°¨ë‹¨ì„ ê±±ì •í•˜ì§€ ì•Šê³  accept를 호출 í•  수 있다.
  • 59. ï½ ê°„ë‹¨í•œ 실습 (client 쪽, client1.c) 그냥 client1만 실행시키면, Server와 ê°™ì´ ì‹¤í–‰ì‹œí‚¤ë©´
  • 60. ï½ ê°„ë‹¨í•œ 실습(server1.c 서버 쪽) ./server1 & ì„ ìž…ë ¥, server1ì„ ë°±ê·¸ë¼ìš´ë“œ 작업하여 client1ì„ ì‹¤í–‰ì‹œí‚¤ëŠ”ë°, ./server1 & 후 ps ì˜ ìƒíƒœëŠ”, 그리고 서버는 íŒŒì¼ ì‹œìŠ¤í…œìƒì˜ ì†Œì¼“ì„ ìƒì„±í•˜ëŠ”ë° ê·¸ 파ì¼ì€ ls 명령으로 ë³¼ 수 있다 다 사용한 ì†Œì¼“ì€ ì œê±°í•˜ëŠ” ê²ƒì´ ì¢‹ë‹¤. (í”„ë¡œê·¸ëž¨ì´ ì‹ í˜¸ì— ì˜í•´ì„œ 비정ìƒì ìœ¼ë¡œ 종료ë˜ì—ˆë‹¤ë©´, ì†Œì¼“ì´ ë‚¨ì•„ 있는지 확ì¸, 제거해야 íŒŒì¼ ì‹œìŠ¤í…œì´ ì§€ì €ë¶„í•´ì§€ëŠ” ê²ƒì„ í”¼í•  수 있다.
  • 61. ï½ ê°„ë‹¨í•œ ì‹¤ìŠµì— ëŒ€í•œâ€¦ â—¦ 서버는 í´ë¼ì´ì–¸íŠ¸ê°€ 기ë¡í•œ ë¬¸ìž í•˜ë‚˜ë¥¼ ì½ì–´ì„œ ê·¸ê²ƒì„ ì¦ê°€í•œ 후 다시 í´ë¼ì´ì–¸íŠ¸ì—게 보낸다.(출력하는 ê±´ í´ë¼ì´ì–¸íŠ¸ 측)
  • 62. ë” ìƒì„¸ížˆ 공부하고 싶었지만 ì²˜ìŒ ì±…ì„ ì •ë…í•œê²ƒì— ëŒ€í•´ ë§Œì¡±ì„ í•˜ë©°, 프로그래ë°ì„ í•  ë•Œ, 다시 ì±…ì„ ë³¼ ë•Œ, 좀 ë” ì½”ë“œ 부분과 ì§ì ‘ 프로그래ë°í•˜ëŠ”ê±° ì— ì¤‘ì ì„ 둘 필요가 있다고 ìƒê°ì´ 드는 공부였다. 그리고 중요하다고 ìƒê°ë˜ëŠ” 부분만 ê³µë¶€í•˜ì˜€ëŠ”ë° ì°¨í›„ì— ê³µë¶€í•  ë•Œì—는 다른 ë¶€ë¶„ë„ ê³µë¶€ë¥¼ 해야겠 다. ë˜ ì†Œì¼“ í”„ë¡œê·¸ëž˜ë° ê°™ì€ ë¶€ë¶„ì€ ë”°ë¡œ ì±…ì´ ìžˆ 으니 ê·¸ ë¶€ë¶„ì— ëŒ€í•´ì„œ ë” ê³µë¶€í•  í•„ìš”ì„±ì´ ëŠê»´ì§„ 다.