πŸƒ‍♀️ Activities/42 Cursus

[get_next_line][C] 파일 λ””μŠ€ν¬λ¦½ν„°(File Descriptor)

0=2. 2025. 6. 2. 22:05

파일 λ””μŠ€ν¬λ¦½ν„°(File Descriptor)

  • 파일 λ””μŠ€ν¬λ¦½ν„°λŠ” ν”„λ‘œμ„ΈμŠ€κ°€ νŒŒμΌμ΄λ‚˜ μžμ›μ— μ ‘κ·Όν•  λ•Œ μ‚¬μš©ν•˜λŠ” λ²ˆν˜Έν‘œλ‹€.
  • μœ λ‹‰μŠ€λ‚˜ λ¦¬λˆ…μŠ€ μ‹œμŠ€ν…œμ—μ„  거의 λͺ¨λ“  것을 '파일'둜 λ³Έλ‹€.
  • ν‘œμ€€μž…λ ₯(0), ν‘œμ€€μΆœλ ₯(1), ν‘œμ€€μ—λŸ¬(2)κ°€ 기본으둜 μ£Όμ–΄μ§„λ‹€.
  • ν”„λ‘œμ„ΈμŠ€κ°€ μƒˆλ‘œμš΄ νŒŒμΌμ„ μ—΄λ©΄, 컀널이 κ°€μž₯ μž‘μ€ μ‚¬μš© κ°€λŠ₯ν•œ 번호λ₯Ό ν• λ‹Ήν•œλ‹€.
  • 이 번호λ₯Ό μ΄μš©ν•΄ ν”„λ‘œμ„ΈμŠ€λŠ” νŒŒμΌμ΄λ‚˜ μ†ŒμΌ“, νŒŒμ΄ν”„ λ“± λ‹€μ–‘ν•œ μžμ›μ— μ ‘κ·Όν•  수 μžˆλ‹€.

 

1. μœ λ‹‰μŠ€μ—μ„œλŠ” "λͺ¨λ“  게 νŒŒμΌμ΄λ‹€"

  • λ‹¨μˆœν•œ 파일뿐 μ•„λ‹ˆλΌ 디렉토리, μ†ŒμΌ“, νŒŒμ΄ν”„, μž₯치 등도 μ „λΆ€ 파일처럼 닀룬닀.
  • κ·Έλž˜μ„œ 무언가와 ν†΅μ‹ ν•˜κ±°λ‚˜ 읽고 μ“Έ λ•ŒλŠ” 항상 "파일처럼 닀루기" μœ„ν•΄ 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό μ‚¬μš©ν•œλ‹€.

 

2. 파일 λ””μŠ€ν¬λ¦½ν„°λŠ” μ •μˆ˜κ°’(번호)이닀

  • 예: 0, 1, 2, 3, 4, ...
  • 0은 ν‘œμ€€μž…λ ₯ (ν‚€λ³΄λ“œ 같은 μž…λ ₯ μž₯치)
  • 1은 ν‘œμ€€μΆœλ ₯ (터미널에 좜λ ₯)
  • 2λŠ” ν‘œμ€€μ—λŸ¬ (였λ₯˜ λ©”μ‹œμ§€ 좜λ ₯)

ν”„λ‘œκ·Έλž¨μ΄ μ‹œμž‘ν•  λ•Œ 이 3κ°œλŠ” μžλ™μœΌλ‘œ μ—΄λ¦° μƒνƒœλ‘œ μ‹œμž‘ν•œλ‹€.

 

λ””μŠ€ν¬λ¦½ν„° 번호 의미 POSIX 이름 Cμ—μ„œμ˜ 슀트림
0 ν‘œμ€€ μž…λ ₯ STDIN_FILENO stdin
1 ν‘œμ€€ 좜λ ₯ STDOUT_FILENO stdout
2 ν‘œμ€€ μ—λŸ¬ STDERR_FILENO stderr

unistd.h 헀더에 STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO 같은 이름이 μ •μ˜λ˜μ–΄ μžˆλ‹€.

 

3. νŒŒμΌμ„ μ—΄λ©΄ λ²ˆν˜Έκ°€ ν•˜λ‚˜ λ°°μ •λœλ‹€

  • open() ν•¨μˆ˜ 같은 κ±Έ ν˜ΈμΆœν•˜λ©΄ 컀널이 μ•ˆ μ“°κ³  μžˆλŠ” κ°€μž₯ μž‘μ€ 번호λ₯Ό 골라쀀닀.
  • 이후 read, write λ“± νŒŒμΌμ— μ ‘κ·Όν•  λ•Œ 이 번호λ₯Ό 계속 μ‚¬μš©ν•œλ‹€.

 

μ˜ˆμ‹œ

ν˜„μž¬ μ—΄λ¦° fd 번호 의미
0 ν‘œμ€€μž…λ ₯ (stdin)
1 ν‘œμ€€μΆœλ ₯ (stdout)
2 ν‘œμ€€μ—λŸ¬ (stderr)
3 μ—΄λ € μžˆλŠ” 파일 A
4 μ—΄λ € μžˆλŠ” 파일 B

 

이 μƒνƒœμ—μ„œ open()을 ν˜ΈμΆœν•˜λ©΄, 아직 μ•ˆ 쓰인 κ°€μž₯ μž‘μ€ 번호인 5κ°€ λ°˜ν™˜λœλ‹€.

λ§Œμ•½ close(3);을 ν•˜λ©΄ fd 3은 ν•΄μ œλœλ‹€.
κ·Έ λ‹€μŒ open()을 ν˜ΈμΆœν•˜λ©΄ 3이 λ‹€μ‹œ 할당될 수 μžˆλ‹€.

 

4. 파일 λ””μŠ€ν¬λ¦½ν„°λŠ” 컀널 λ‚΄λΆ€ ν…Œμ΄λΈ”μ˜ 인덱슀

  • 컀널은 각 ν”„λ‘œμ„ΈμŠ€λ§ˆλ‹€ ‘μ—΄λ¦° 파일 λͺ©λ‘ ν…Œμ΄λΈ”’을 κ΄€λ¦¬ν•œλ‹€.
  • λ””μŠ€ν¬λ¦½ν„°λŠ” 이 ν…Œμ΄λΈ”μ˜ λ²ˆν˜Έμ΄λ‹€.
  • 이 ν…Œμ΄λΈ”μ—λŠ” μ‹€μ œ 파일 정보, 읽기/μ“°κΈ° μœ„μΉ˜(offset), μ ‘κ·Ό λͺ¨λ“œ 등이 κΈ°λ‘λ˜μ–΄ μžˆλ‹€.

 

OPEN_MAX

OPEN_MAXλŠ” POSIXμ—μ„œ μ •μ˜ν•œ μƒμˆ˜λ‘œ,ν•œ ν”„λ‘œμ„ΈμŠ€κ°€ λ™μ‹œμ— μ—΄ 수 μžˆλŠ” 파일 λ””μŠ€ν¬λ¦½ν„° 수의 μ΅œμ†Œκ°’ λ˜λŠ” 기쀀값이닀.
<limits.h>에 μ„ μ–Έλ˜μ–΄ μžˆλ‹€.

OPEN_MAXλŠ” 컴파일 μ‹œμ— μ •ν•΄μ§„ 값이고, μ‹€μ œ λŸ°νƒ€μž„μ—μ„œ κ°€λŠ₯ν•œ μ΅œλŒ€ fd 수(ulimit -n)λŠ” 더 ν¬κ±°λ‚˜ λ‹€λ₯Ό 수 μžˆλ‹€.

 

ulimit -n

  • μ‹€μ œλ‘œλŠ” ulimit -n으둜 ν™•μΈλ˜λŠ” 값이 μ μš©λœλ‹€.
  • λ§Žμ€ μ‹œμŠ€ν…œμ—μ„œλŠ” 기본값이 1024μ§€λ§Œ, μ΄λŠ” μ‚¬μš©μž/μ„Έμ…˜/ν”„λ‘œμ„ΈμŠ€ 섀정에 따라 λ‹€λ₯΄λ‹€.
  • 즉, fd > 1024 쑰건을 μ“°κ³  μ‹Άλ‹€λ©΄, μ •μ μœΌλ‘œ OPEN_MAX만 믿으면 μœ„ν—˜ν•˜λ‹€. OPEN_MAXλŠ” "보μž₯된 μ΅œμ†Œκ°’"이고, "μ΅œλŒ€κ°’"은 μ•„λ‹ˆλ‹€.
  • getrlimit() λ˜λŠ” ulimit -n 값에 κΈ°λ°˜ν•΄ νŒλ‹¨ν•˜λŠ” 게 μ •ν™•ν•˜λ‹€.

 

C μ½”λ“œμ—μ„œ μ‹€μ œ fd μ΅œλŒ€κ°’ ν™•μΈν•˜λ €λ©΄:

#include <sys/resource.h>

struct rlimit rl;
getrlimit(RLIMIT_NOFILE, &rl);
printf("Max open fds: %ld\n", rl.rlim_cur); // ν˜„μž¬ μ œν•œ