Contents

System Programming Ch3

   Oct 14, 2022     5 min read

๐Ÿ’กย Chap_3

File Descriptors

File Descriptors

๐Ÿ“Ž File Descriptors

  • os์—์„œ ํ™•์ •๋œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ

    0 : ํ‘œ์ค€์ž…๋ ฅ

    1 : ํ‘œ์ค€์ถœ๋ ฅ

    2 : ํ‘œ์ค€์—๋Ÿฌ

  • ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋ฐ˜ํ™˜๋ฐ›์„ ๋•Œ๋Š” 0,1,2๋ฅผ ์ œ์™ธํ•˜๊ณ  ๊ฐ€์žฅ ๋‚ฎ์€ integer์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— non-negative integer returned by open or create

๐Ÿ“Ž open function

(๋‹จ๋‹ตํ˜•)ํŒŒ์ผ์„ ์—ฌ๋Š” ํ•จ์ˆ˜๋ช…์„ ์“ฐ์‹œ์˜ค.

โ‡’ open

#include <fcntl.h>
int open(const char *pathname, int oflag, ... /* , mode_t mode */);

oflag argument

  • open์˜ ์ธ์ž (int oflag)
  • ์ฝ์„๊ฑด์ง€, ์“ธ๊ฑด์ง€, ๋‘˜ ๋‹ค ํ• ๊ฑด์ง€
    1. O_RDONLY : ์ฝ๊ธฐ๋งŒ ํ•จ
    2. O_WRONLY : ์“ฐ๊ธฐ๋งŒ ํ•จ
    3. O_RDWR : ๋‘˜ ๋‹ค ํ•จ
  • Optional
    1. O_APPEND : ํŒŒ์ผ์— ์ด๋ฏธ ๋‚ด์šฉ์ด ์žˆ๋Š”๋ฐ ๊ทธ ๋’ค์— ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์”€
    2. O_CREAT : ์—†๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ค ๋•Œ ์”€
    3. O_EXCL : exception, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
    4. O_TRUNC : truncate, ์•ˆ์— ์žˆ๋Š” ๋‚ด์šฉ์„ ์ „๋ถ€ ๋‚ ๋ ค์คŒ
    5. O_NOCTTY
    6. O_NONBLOCK

๐Ÿ“Ž creat , close Function

#include <fcntl.h>
int creat(const char *pathname, mode_t mode);

//equivalent to
open(pathname, O_WRONLY | O_CREAT |O_TRUNC, mode);
  • openํ•จ์ˆ˜์—์„œ O_CREAT๋Š” ์˜ต์…˜์ด๊ณ , creat๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.
  • close๋Š” ์ด์ œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋”์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค, ์ฆ‰ ๋‹ซ๋Š” ํ•จ์ˆ˜

๐Ÿ“Ž read, write Function

  • read ํ•จ์ˆ˜๋Š” ์ฝ์€ ๋ฐ”์ดํŠธ ์ˆ˜๋งŒํผ ๋ฐ˜ํ™˜์„ ํ•จ
  • EOF(end of file)๋Š” 0์„ ๋ฐ˜ํ™˜
  • EOF ๋งŒ๋‚˜๋ฉด ํŒŒ์ผ์˜ ๋
  • write ํ•จ์ˆ˜๋Š” ์“ด ๋ฐ”์ดํŠธ ์ˆ˜๋งŒํผ ๋ฐ˜ํ™˜์„ ํ•จ
#include <unistd.h>
ssize_t write(int filedes, const void *buf, size_t nbytes);
  • nbytes ๋‚ด๊ฐ€ ์“ฐ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋ฐ”์ดํŠธ์˜ ์ˆ˜ (์ด๊ฒƒ๊ณผ write๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ์ˆ˜๋ฅผ ๋น„๊ตํ•ด์„œ ๊ฐ™์€์ง€ ํ™•์ธํ•˜๋ฉด ์ œ๋Œ€๋กœ ์ˆ˜ํ–‰ํ–ˆ๋Š”์ง€ ํ™•์ธ ๊ฐ€๋Šฅ)

๐Ÿ“Ž lseek Function

  • ๋‚ด๊ฐ€ ํŒŒ์ผ์„ ์–ด๋””๊นŒ์ง€ ์ฝ์—ˆ๋Š”์ง€, ๋˜๋Š” ์–ด๋””์„œ๋ถ€ํ„ฐ ์“ธ์ง€ ์œ„์น˜๋ฅผ ์•Œ๊ณ ์‹ถ์„ ๋•Œ ์”€
  • ํ˜น์€ ๊ทธ ์œ„์น˜๋กœ ์˜ฎ๊ฒจ๊ฐˆ ๋•Œ ์”€
  1. SEEK_SET : ์ฒ˜์Œ ์œ„์น˜๋กœ ์˜ฎ๊ฒจ๊ฐ (offset from the beginning of the file)
  2. SEEK_CUR : ์ง€๊ธˆ ํ˜„์žฌ ์œ„์น˜ (current file offset + offset)
  3. SEEK_END : ํŒŒ์ผ์˜ ๋ (file size + offset) (์ด๋•Œ offset์€ ์Œ์ˆ˜)
    • offset : ์–ผ๋งˆ๋งŒํผ skip ํ• ๊ฑด์ง€ ์ •ํ•ด์คŒ (๊ธฐ์ค€์ ์ด ๋จ)

(๋‹จ๋‹ตํ˜•)

ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์ฒ˜์Œ์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ์˜ต์…˜์€? โ‡’ SEEK_SET

๋์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ์˜ต์…˜์€? โ‡’ SEEK_END

ํŒŒ์ผ์ด ํ˜„์žฌ ์ฝ๊ณ ์žˆ๋Š” ํฌ์ธํ„ฐ์˜ ์œ„์น˜๋ฅผ ์˜ฎ๊ธฐ๋Š” ํ•จ์ˆ˜๋Š”? โ‡’ lseek

File Sharing

File Sharing_1

File Sharing_1 (๊ทธ๋ฆผ ์ž์ฒด๋ฅผ ๊ทธ๋ฆฌ๋ผ๋Š” ๋ฌธ์ œ๊ฐ€ ๋‚˜์˜ฌ ํ™•๋ฅ ์ด ๋งค์šฐ ๋†’์Œ) -์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐˆ์ˆ˜๋ก ์ ์  ํ•˜๋“œ์›จ์–ด์— ๊ฐ€๊นŒ์›€ โ†’ ์œ„ ๊ทธ๋ฆผ์€ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค์—์„œ ๋‘๊ฐœ์˜ file descriptor๋ฅผ ๋งŒ๋“ค๊ณ  ๊ฐ๊ธฐ ๋‹ค๋ฅธ v-node์— ์ ‘๊ทผ

๐Ÿ“Ž process table entry

  • ํ”„๋กœ์„ธ์Šค(์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•˜๋Š” main์•ˆ์— ์žˆ๋Š” ์ฝ”๋“œ)์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ถœ์„๋ถ€
  • ํ”„๋กœ์„ธ์Šค์—์„œ ์–ด๋–ค file descriptor๋“ค์ด ์—ด๋ ค์žˆ๋Š”์ง€๋ฅผ ์•Œ๋ ค์คŒ (0,1,2 ๋Š” os์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์—ด์–ด ๋†“์Œ)

file table

  • ํŒŒ์ผ์— ๋Œ€ํ•œ ์ •๋ณด(ํŒŒ์ผ์˜ ์ด๋ฆ„, ์ƒ์„ฑ์ž, ์†Œ์œ ์ž, ์†Œ์œ ๊ทธ๋ฃน, ์ƒ์„ฑ์‹œ๊ฐ„, ์ด ํŒŒ์ผ์˜ ๋””์Šคํฌ๋ฆฝํ„ฐ๋Š” ๋ช‡๊ฐœ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋‚˜ ๋“ฑ, metadata)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ถœ์„๋ถ€(table)
  • metadata๋Š” ์‹ค์ œ๋กœ i-node์— ์žˆ์Œ, file table์€ ์ค‘๊ฐ„์ž ์—ญํ• 
  • ํŒŒ์ผ์˜ ๊ฐœ์ˆ˜๋งŒํผ ์กด์žฌ
  • file status flags : ์“ฐ๊ธฐ๋ชจ๋“œ๋กœ ์—ด๋ ค์žˆ๋‚˜, ์ฝ๊ธฐ๋ชจ๋“œ๋กœ ์—ด๋ ค์žˆ๋‚˜ โ€ฆ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ƒํƒœ ์ •๋ณด
  • current file offset : ํŒŒ์ผ์ด ์–ด๋””์„œ๋ถ€ํ„ฐ ์–ด๋””๊นŒ์ง€ ์ €์žฅ๋˜์–ด์žˆ๋Š”์ง€ ๋‚˜ํƒ€๋‚ด๋Š” ๊ธฐ์ค€
  • v-node ptr : ์‹ค์ œ๋กœ ๋”ฐ๋ผ๊ฐ€๋ณด๋ฉด i-node๊ฐ€ ์žˆ์Œ , ์ด i-node๊ฐ€ metadata๋ฅผ ๋‹ด๊ณ ์žˆ์Œ

v-node table

  • v-node๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํ…Œ์ด๋ธ”

v-node

โ†’ os๋ ˆ๋ฒจ์—์„œ ์ข€ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ค€, i-node๋ฅผ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•˜๋ผ๊ณ  ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ฒƒ

โ†’ ์ฆ‰, i-node๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ virtual node interface์ด๋‹ค.

i-node

โ†’ ํ•˜๋‚˜์˜ architecture, unix linux ์‹œ์Šคํ…œ์—์„œ ํŒŒ์ผ์„ ์ €์žฅ ํ•˜๋ ค๋ฉด i-node๋ผ๋Š” ๊ตฌ์„ฑ์„ ๋”ฐ๋ผ์•ผํ•จ, ์ด ํ‘œ์ค€์ด i-node architecture

โ†’ ํ•˜๋“œ์›จ์–ด์— ๋” ๊ฐ€๊นŒ์šด ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ, ๋ฉ”๋ชจ๋ฆฌ/๋žจ์— ๋” ๊ฐ€๊นŒ์›Œ์ง

โ†’ ํŒŒ์ผ์˜ ์šฉ๋Ÿ‰์ด ๋Š˜์–ด๋‚  ๋•Œ ํŽ˜์ด์ง€๋Š” ๋ช‡๊ฐœ๋ฅผ ์“ฐ๊ณ โ€ฆ ์ด๋Ÿฐ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์Œ, ์ˆ˜์น˜ํ™”๋œ ์ •๋ณด

โ†’ ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์•ผํ•˜๋Š”๋ฐ, ์šด์˜์ฒด์ œ ์•ˆ์˜ ์ปค๋„์ด ๊ด€๋ฆฌํ•จ

โ†’ ์ปค๋„์€ ์‚ฌ์šฉ์ž๊ฐ€ ์“ฐ๊ธฐ์—๋Š” ๋„ˆ๋ฌด ์–ด๋ ค์›€ ๊ทธ๋ž˜์„œ os๋ฅผ ๋งŒ๋“ค์–ด๋†“์Œ

*process table entry, file table, v-node table ๋ชจ๋‘ ์ปค๋„์—์„œ ๊ด€๋ฆฌํ•จ

File Sharing_2

File Sharing_2 โ†’ ์œ„ ๊ทธ๋ฆผ์€ ๊ตฌ์กฐ๋Š” ๋˜‘๊ฐ™์ง€๋งŒ ํฌ์ธํŒ…ํ•˜๋Š” ํ™”์‚ดํ‘œ์˜ ๋ฐฉํ–ฅ๊ณผ ๊ฐœ์ˆ˜๊ฐ€ ๋‹ค๋ฆ„ โ†’ ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ํŒŒ์ผ ํ…Œ์ด๋ธ”์— ์ ‘๊ทผํ•˜๋Š”๋ฐ v-node๊ฐ€ ๊ฐ™์Œ

๐Ÿ“Ž v-node๊ฐ€ ๊ฐ™๋‹ค = i-node๊ฐ€ ๊ฐ™๋‹ค =

์„œ๋กœ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋‘๊ฐœ๊ฐ€ ๊ฐ™์€ ํŒŒ์ผ์„ ํฌ์ธํŒ…ํ•˜๊ณ  ์žˆ๋‹ค.

ํŒŒ์ผ ์˜คํ”ˆ์„ ๋˜‘๊ฐ™์€ ํŒŒ์ผ์— ๋Œ€ํ•ด ๋‘๋ฒˆํ•˜๋Š” ๊ฒƒ์ž„

dup and dup2 Functions

dup and dup2 Functions โ†’ ํ”„๋กœ์„ธ์Šค ํ•˜๋‚˜๊ฐ€ ๊ฐ™์€ ํŒŒ์ผํ…Œ์ด๋ธ”์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  v-node๋„ ๊ฐ™์Œ

๐Ÿ“Ž dup, dup2 Functions

  • duplicate
  • dup ํ•จ์ˆ˜๋ฅผ ์“ฐ๋ฉด ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•จ
  • ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋ณต์‚ฌ
  • dup2๋Š” ๊ฐ™์€์—ญํ• , ์ธ์ž๋งŒ ๋‹ค๋ฆ„

(๋‹จ๋‹ตํ˜•)ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ํ•จ์ˆ˜๋Š”?

โ‡’ dup ๋˜๋Š” dup2

  • dup : ๊ฐ€์žฅ ๋‚ฎ์€ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋ฐ˜ํ™˜
  • dup2: fd1์„ fd2๋กœ ๋ณต์ œํ•˜์—ฌ fd2๋ฅผ ๋ฐ˜ํ™˜ (fd2๊ฐ€ ์—ด๋ ค์žˆ๋‹ค๋ฉด closeํ•˜๊ณ  ๋ณต์ œ)

Atomic Operations

๐Ÿ“Ž race condition(๊ฒฝ์Ÿ ์ƒํƒœ)

  • ํ”„๋กœ์„ธ์Šค ๋‘๊ฐœ๊ฐ€ ๋™์ž‘์„ ํ•˜๋Š”๋ฐ, ํ”„๋กœ์„ธ์Šค ํ•˜๋‚˜๋Š” ์ฆ๊ฐ€์—ฐ์‚ฐ์ž, ํ•˜๋‚˜๋Š” ๊ฐ์†Œ์—ฐ์‚ฐ์ž๋ผ๋ฉด ์„œ๋กœ ๋™๊ธฐ๊ฐ€ ๋งž๋Š”๋‹ค๋ฉด ์ดˆ๊ธฐ๊ฐ’๊ณผ ๊ฐ™์•„์งˆ ๊ฒƒ์ž„
  • ๋™๊ธฐํ™”๋ผ์„œ ์ผ์–ด๋‚˜๋ฉด ๊ณ„์† 0์ผ ๊ฒƒ์ž„(์ดˆ๊ธฐ๊ฐ’์ด 0์ด๋ผ๋ฉด)
  • ๊ทผ๋ฐ, ๋™๊ธฐ๊ฐ€ ์•ˆ๋งž์œผ๋ฉด(์ •ํ™•ํžˆ 1์ดˆ์— ํ•œ๋ฒˆ์”ฉ ์ˆ˜ํ–‰์ด ์•ˆ๋จ) โ‡’ ๋ ˆ์ด์Šค ์ปจ๋””์…˜
  • ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ์˜ํ–ฅ์„ ๋ฏธ์นจ

atomic operation

  • ์„œ๋กœ ๋‹ค๋ฅธ ๋‘๊ฐœ์˜ ๋™์ž‘ ๊ฐ„์— ์„œ๋กœ๊ฐ„์˜ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ
  • ๊ฐ๊ฐ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•˜๋Š” ์ผ์€ ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฉด ์•ˆ๋œ๋‹ค โ†’ ์›์ž์ ์ธ(atomic) ์ˆ˜ํ–‰
if (lseek(fd, 0L, SEEK_END) < 0) 
//์ง€๊ธˆ ํ˜„์žฌ fd๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ํŒŒ์ผ์˜ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€, ์ด๋ฅผ 1500์ด๋ผ ๊ฐ€์ •
	err_sys("lseek error");
if (write(fd, buf, 100) != 100)
	err_sys("write error");

โ†’ process A๊ฐ€ ํŒŒ์ผ์˜ ๋์„ ์•Œ๊ณ ์‹ถ์–ด์„œ lseek ํ•จ์ˆ˜๋ฅผ ์”€ A์˜ ๊ธธ์ด 1500์ด๋ผ ๊ฐ€์ •

โ†’ process B๋„ ๊ธธ์ด๊ฐ€ 1500์ธ๋ฐ, A๋ณด๋‹ค ๋จผ์ € ์ˆ˜ํ–‰์ด ๋จ

โ†’ B๋Š” 100๊ฐœ๋ฅผ ๋” ์”€, B์˜ file descriptor๋Š” 1600์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋จ

โ†’ A๊ฐ€ write๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด A๋Š” B๊ฐ€ ์“ด ๊ฒƒ์„ overwriteํ•˜๊ฒŒ ๋จ

์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ race condition ์ด ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ํ•จ

โ‡’ ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ™์€ ํŒŒ์ผ์„ ํฌ์ธํŒ… ํ•˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ์— atomic operation์„ ๋ณด์žฅํ•ด์•ผํ•จ

โ‡’ ์›์ž์„ฑ์„ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด write ํ•จ์ˆ˜๋ฅผ ์“ธ ๋•Œ O_APPEND๋ฅผ ์จ์•ผ๋จ

๐Ÿ“Ž atomic operation์„ ๋ณด์žฅํ•˜๋Š” ํ•จ์ˆ˜

โ‡’ pread, pwrite

  • pread : lseek์„ ํ•˜๊ณ  read ํ•จ, ํŒŒ์ผ์˜ ๋์„ ๊ฒ€์ƒ‰ํ•œ ๋’ค์— ์ฝ์–ด์˜ด
  • pwrite : ๋์œผ๋กœ ์˜ฎ๊ฒจ๊ฐ„ ๋‹ค์Œ์— ์”€

โ†’ race condition์ฒ˜๋Ÿผ ์„œ๋กœ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ฐฐ์ œํ•˜๊ฒ ๋‹ค.

๐Ÿ“Ž sync

  • :w ํ•˜๋ฉด ์ €์žฅ์ด ๋˜๋Š”๋ฐ ๋‚ด์šฉ๋งŒ ๋””์Šคํฌ์— ์ €์žฅ์ด ๋˜๋Š” ๊ฒƒ, ํŒŒ์ผ์˜ ์ •๋ณด ์ €์žฅ์€ ์ปค๋„์ด ํ•˜๋Š” ์ผ
  • ๋””์Šคํฌ์— ์ €์žฅํ•  ๋•Œ i-node์— ๊ด€ํ•œ ์ •๋ณด๊นŒ์ง€ ์ €์žฅ๋ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ํ•จ์ˆ˜

fsync

  • sync์™€ ๊ฐ™์€ ์—ญํ• 

fdatasync

  • data๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ฒƒ๊นŒ์ง€๋งŒ ๊ธฐ๋‹ค๋ฆผ (i-node๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฑด ์•„๋‹˜)

๐Ÿ“Ž fcntl

  • ํŒŒ์ผ์˜ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์“ฐ๋Š” ํ•จ์ˆ˜
  • file control

๐Ÿ“Ž /dev/fd

  • dev : ์šฐ๋ถ„ํˆฌ๋‚˜ ๋ฆฌ๋ˆ…์Šค์—์„œ ์ตœ์ƒ์œ„ directory๋Š” โ€œ / โ€œ ,

    ๊ทธ ์ตœ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ ๋ฐ”๋กœ ๋ฐ‘์— โ€œ dev โ€œ(device)๊ฐ€ ์žˆ์Œ,

    ๊ทธ ์•ˆ์— โ€œ fd โ€œ(file descriptor)๋ผ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์žˆ์Œ

  • fd 0,1,2๋Š” ๊ณ ์ •, ์‚ฌ์šฉ์ž๊ฐ€ ๋ชป์”€

    ๊ทผ๋ฐ ์ด๊ฑธ ์“ฐ๊ฑฐ๋‚˜ ๋ณต์‚ฌํ•˜๊ณ  ์‹ถ์œผ๋ฉด ๋ณต์‚ฌํ•ด์„œ ์”€

  • 3๋ฒˆ์œผ๋กœ ํ‘œ์ค€์ž…๋ ฅ์„ ํ•˜๋ ค๋ฉด /dev/fd์— ์žˆ๋Š” 0์„ ์—ฐ๋‹ค.

    ๊ทธ๋Ÿฌ๋ฉด 0๋ฒˆ์ด ์•„๋‹Œ 3๋ฒˆ(์ œ์ผ ์ž‘์€ ์–‘์ˆ˜๊ฐ’)์œผ๋กœ ํ‘œ์ค€์ž…๋ ฅ์ด ์ƒ๊น€

(๋‹จ๋‹ตํ˜•)ํ‘œ์ค€์ž…๋ ฅ/ํ‘œ์ค€์ถœ๋ ฅ/ํ‘œ์ค€์—๋Ÿฌ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ๋‹ค๋ฅธ ํŒŒ์ผ๋””์Šคํฌ๋ฆฝํ„ฐ๋กœ ํ• ๋‹น๋ฐ›๊ณ ์ž ํ• ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋Š” ๋ฌด์—‡์ธ๊ฐ€?

โ‡’ open ๋˜๋Š” dup