Skip to content

Latest commit

ย 

History

History
612 lines (443 loc) ยท 19.7 KB

File metadata and controls

612 lines (443 loc) ยท 19.7 KB

Chapter3. ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ† ๋ฆฌ

20180912

mycopy ์‹ค์Šต ์š”์  / ๋‚˜์ค‘์— ์‹œํ—˜์—์„œ read & write ์‹œ ์ฃผ์˜ํ•  ์ 

nread = read(fd1, buffer, BUFSIZE);
while(nread > 0) {
  write(fd2, buffer, nread);
  nread = read(fd1, buffer, BUFSIZE);
}
  • ์ด๋ ‡๊ฒŒ nread ๊ฐ’์„ ์‚ฌ์šฉํ•ด์„œ writeํ•˜๋Š” ์ด์œ  :

    • writeํ•  ๋•Œ 512 byte ๋‹จ์œ„๋กœ ๋ฐ›์•„์˜ค๋Š”๋ฐ, ๊ทธ๋ž˜์„œ ํŽธํ•˜๊ฒŒ ํ•˜๋ ค๊ณ  512 ๊ทธ๋Œ€๋กœ writeํ•˜๋ฉด (๋งˆ์ง€๋ง‰ 512 byte์—์„œ 512๋งŒํผ ๋‹ค ์•ˆ ์ฑ„์›Œ์ ธ์žˆ๋Š” ๊ฒฝ์šฐ, ๋ถˆํ•„์š”ํ•œ ์•„๋ฌด ๊ฒƒ๋„ ์•ˆ ์—†๋Š” ์“ฐ๋ ˆ๊ธฐ ๋ถ€๋ถ„๋งˆ์ € write๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—) copy ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ํŒŒ์ผ์ด ๋” ์ปค์ง„ ์ƒํƒœ๋กœ ๋ณต์‚ฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.
    • ๊ทธ๋ž˜์„œ nread๋ผ๋Š” ๋ณ€์ˆ˜์— read()ํ•œ๋งŒํผ์˜ byte๋ฅผ ์ €์žฅํ•ด์„œ ๊ทธ๋งŒํผ๋งŒ write๋ฅผ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
  • read return ๊ฐ’

    • ์„ฑ๊ณต์‹œ ์‹ค์ œ์ฝํžŒ byte ์ˆ˜ / ์‹คํŒจ์‹œ -1
    • return ๊ฐ’ < nbytes์ด๋ฉด, ํŒŒ์ผ์— ๋‚จ์€ data๊ฐ€ nbytes๋ณด๋‹ค ์ ์€ ๊ฒฝ์šฐ
    • ๋” ์ด์ƒ ์ฝ์„ ๋‚ด์šฉ์ด ์—†์œผ๋ฉด return ๊ฐ’์€ 0
    • ํ˜น์‹œ๋‚˜ -1์ด ๋ฐ˜ํ™˜์ด ๋˜๋Š” ๊ฒฝ์šฐ read์— ์‹คํŒจํ•œ๊ฑด๋ฐ, ์—†๋Š” ํŒŒ์ผ์„ ์—ด๊ฑฐ๋‚˜ open ์ž˜๋ชปํ–ˆ์„ ๋•Œ -1์„ return ํ•˜๋‹ˆ๊นŒ ์–ด๋””์„œ -1์„ return ํ•˜๋Š”์ง€ ์ž˜ ํ™•์ธํ•ด๋ณด๊ธฐ
    • ์ด๊ฑธ๋กœ ํŒŒ์ผ์—์„œ ๋” ์ฝ์„๊ฒŒ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ํŒŒ์•…ํ•˜๋ฉด ๋จ
  • write return ๊ฐ’

    • ๋ณดํ†ต์€ return๊ฐ’ = n
    • return ๊ฐ’ < n์ด๋ฉด, ์“ฐ๋Š” ๋„์ค‘ media๊ฐ€ full
    • ๋งŒ์•ฝ ์“ฐ๊ธฐ ์ „์— ๊ฝ‰ ์ฐจ๋ฉด -1 return

ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ† ๋ฆฌ

  • ๋””๋ ‰ํ† ๋ฆฌ๋ผ๋Š” ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒƒ์ž„. ํด๋”๋ผ๋Š” ๊ฒƒ์ด ์‚ฌ์‹ค ์กด์žฌํ•˜์ง€๋Š” ์•Š์Œ

ํŒŒ์ผ ์ •๋ณด์˜ ํš๋“

  • stat - open๋˜์ง€ ์•Š์€ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ •๋ณด๋„ ํš๋“ ๊ฐ€๋Šฅ

  • fstat - open๋œ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ •๋ณด ํš๋“ ๊ฐ€๋Šฅ

    #include<fcntl.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    int stat (const char *pathname, struct stat *buf);
    int fstat (int filedes, struct stat *buf);
  • buf์—” ํŒŒ์ผ ์ •๋ณด๊ฐ€ ์ €์žฅ๋จ

    • st_dev, st_ino identifier (๋…ผ๋ฆฌ์  ์žฅ์น˜๋ฒˆํ˜ธ์™€ inode ๋ฒˆํ˜ธ)
    • st_mode permission mode
    • st_nlink link์˜ ์ˆ˜
    • st_uid, st_gid user์˜ uid์™€ gid
    • st_rdev file์ด ์žฅ์น˜์ธ ๊ฒฝ์šฐ๋งŒ ์‚ฌ์šฉ
    • st_size ๋…ผ๋ฆฌ์  ํฌ๊ธฐ
    • st_atime, st_mtime, st_ctime file์˜ ์ตœ๊ทผ access time,update time, stat ๊ตฌ์กฐ์˜ update time
    • st_blksize I/O block ํฌ๊ธฐ
    • st_blocks ํŒŒ์ผ์— ํ• ๋‹น๋œ block์˜ ์ˆ˜
    struct stat {
      dev_t     st_dev;         /* ์žฅ์น˜ํŒŒ์ผ์˜ ์œ„์น˜ ๋ฐ ์—ฌ๋ถ€ device id */
      ino_t     st_ino;         /* ํŒŒ์ผ์˜ inode ๋ฒˆํ˜ธ */
      mode_t    st_mode;        /* file permission ์ •๋ณด */
      nlink_t   st_nlink;       /* ํ•˜๋“œ๋งํฌ์˜ ๊ฐฏ์ˆ˜ */
      uid_t     st_uid;         /* user id */
      gid_t     st_gid;         /* group id */
      dev_t     st_rdev;        /* ์žฅ์น˜ํŒŒ์ผ(inode)๋ฅผ ๊ธฐ์ˆ  */
      off_t     st_size;        /* ํ•ด๋‹น ํŒŒ์ผ์˜ ์ด ํฌ๊ธฐ*/
      blksize_t st_blksize;     /* ํšจ์œจ์ ์ธ I/O ํŒŒ์ผ ์‹œ์Šคํ…œ ์œ„ํ•œ ๋ธ”๋Ÿญ ์‚ฌ์ด์ฆˆ*/
      blkcnt_t  st_blocks;      /* ํ• ๋‹น๋œ ๋ธ”๋Ÿญ ์‚ฌ์ด์ฆˆ */
    };    
    // ์ถœ์ฒ˜: http://cokk.tistory.com/51 [่ฉฆ่กŒ้Œฏ่ชค(์‹œํ–‰์ฐฉ์˜ค)]
  • example.c

#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>

int main() {
  //os๋Š” ๊ตฌ์กฐ์ฒด ํƒ€์ž…์œผ๋กœ stat/fstat์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ์กฐ์ฒด ํƒ€์ž… ์„ ์–ธ์ด ํ•„์š”ํ•จ
  struct stat buf;
  stat("data", &buf);
  //%o 8์ง„์ˆ˜ ์ถœ๋ ฅ, st_mode &0777 ๋น„ํŠธํ™”ํ•ด์„œ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์€ ๊ทธ ๋ถ€๋ถ„๋งŒ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด์„œ
  printf("%o %ld\n", buf.st_mode&0777, buf.st_size);
}
  • ์‹คํ–‰ ๋ฐ ์ถœ๋ ฅ
  [s13011022@bce LAB09-12]$ gcc example.c
  [s13011022@bce LAB09-12]$ ./a.out
  644 6
  
[s13011022@bce LAB09-12]$ ls -l
  ํ•ฉ๊ณ„ 20
  -rwxr-xr-x. 1 s13011022 class 8632  9์›” 12 16:55 a.out
  -rw-r--r--. 1 s13011022 class    6  9์›” 12 16:55 data
  -rw-r--r--. 1 s13011022 class  306  9์›” 12 16:55 example.c

Access Permission

  • file mode

  • ์ƒ์ง•ํ˜• ๋ชจ๋“œ

    • 0764 = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IROTH
    • [S_I]
    • [R/W/X]
  • [USR/GRP/OTH]

  • uid : ํŒŒ์ผ ๋งŒ๋“  ์‚ฌ๋žŒ, owner์˜ id.

  • ์†Œ์œ ๊ถŒ์ž : ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ ์‚ฌ๋žŒ, uid, guid

  • euid : ํŒŒ์ผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์˜ id

  • ์‚ฌ์šฉ์ž : ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ, euid, egid

  • 04000 S_IUID

    • ์‹คํ–‰์ด ์‹œ์ž‘๋˜๋ฉด ์†Œ์œ ์ž์˜ uid๊ฐ€ euid๊ฐ€ ๋œ๋‹ค

    • id = 95์ธ ์นœ๊ตฌ๊ฐ€ ๋‚ด dir์— ๋“ค์–ด์™€์„œ ์‹คํ–‰๊ฐ€๋Šฅํ•œ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋ฉด euid(effective uid)๊ฐ€ 95๊ฐ€ ๋œ๋‹ค๋Š” ๋œป

      ๋‚˜์˜ id = 73 ์นœ๊ตฌ์˜ id = 95
      ๋‚ด๊ฐ€ ๋งŒ๋“  Program1 uid = 73
      0711์˜ permission. ๋‚˜๋Š” ์ฝ๊ธฐ/์“ฐ๊ธฐ/์‹คํ–‰ ๋‹ค ๊ฐ€๋Šฅ. ๋‚˜ ์ด์™ธ๋Š” ์‹คํ–‰๋งŒ ๊ฐ€๋Šฅ
      ์นœ๊ตฌ๊ฐ€ ๋‚ด dir์— ๋“ค์–ด์™€์„œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰๊ฐ€๋Šฅํ•ด์„œ ์‹คํ–‰ํ–ˆ์Œ
      ๊ทผ๋ฐ Program1์€ data1์ด๋ผ๋Š” ํŒŒ์ผ์„ ์ฝ๊ณ  ์“ฐ๋Š” ํ”„๋กœ๊ทธ๋žจ์ž„. ๊ทผ๋ฐ ๋‚ด๊ฐ€ data1 ํŒŒ์ผ์„ 0600 permission์„ ์ฃผ๊ฒŒ ๋˜๋ฉด ==> ์นœ๊ตฌ๋Š” Program1์€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ Program1์ด ์ฝ๊ณ  ์“ฐ๋Š” data1ํŒŒ์ผ์„ ์—ด์ง€๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— P1ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰์ด ์•ˆ ๋œ๋‹ค
    • ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ, Program1์€ ์‹คํ–‰๊ฐ€๋Šฅํ•˜๊ฒŒ permission์„ ๋ถ€์—ฌํ–ˆ์ง€๋งŒ ์–ด์ฐจํ”ผ data1ํŒŒ์ผ์„ ๋ชป์—ด๊ธฐ ๋•Œ๋ฌธ์— permission์— ์˜๋ฏธ๊ฐ€ ์—†์–ด์ง„๋‹ค

    • ๊ทธ๋ž˜์„œ Program1 ์‹คํ–‰ ๋„์ค‘์—๋งŒ data1ํŒŒ์ผ์„ open ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ฒŒ ํ•˜๋ ค๋ฉด 04711์ด๋ผ๋Š” permission์„ ์ฃผ๋ฉด ๋œ๋‹ค.

    • (data1์—๋‹ค๊ฐ€ permission์„ ๋ถ€์—ฌํ•˜๋Š”์ง€? Program1์—๋‹ค๊ฐ€ permission์„ ๋ถ€์—ฌํ•˜๋Š”์ง€?)

    • ๊ทธ๋Ÿฌ๋ฉด euid๊ฐ€ ์นœ๊ตฌ์˜ id 95์—์„œ 73์œผ๋กœ ๋ฐ”๋€๋‹ค.

  • 02000 S_ISGID

    • ์‹คํ–‰์ด ์‹œ์ž‘๋˜๋ฉด ์†Œ์œ ์ž์˜ gid๊ฐ€ egid๊ฐ€ ๋œ๋‹ค
  • ์™œ ์ด๋Ÿฐ permission์ด ์ƒ๊ฒผ๋Š”์ง€

    • ๊ทธ๋ƒฅ dataํŒŒ์ผ์„ 0644 permission์„ ๋ถ€์—ฌํ•˜๋ฉด ๋˜์ง€ ์•Š๋Š”๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๊ฑด ๋„ˆ๋ฌด ์•ˆ์ผํ•œ ์ƒ๊ฐ์ž„. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค๋ฅธ์‚ฌ๋žŒ๋“ค์ด dataํŒŒ์ผ์„ cat ๋ช…๋ น์œผ๋กœ ํ™•์ธ ๊ฐ€๋Šฅํ•จ. ๊ฐ€๋ น ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ ํ”„๋กœ๊ทธ๋žจ passwd ์ฒ˜๋Ÿผ data1์ด๋ผ๋Š” ํŒŒ์ผ์— ์‚ฌ์šฉ์ž๋“ค์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ €์žฅ๋ผ์žˆ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์‚ฌ์šฉ์ž๋“ค์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ owner๋ง๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์กฐํšŒ๋ฅผ ํ•˜๋ฉด ์•ˆ ๋˜๋Š” ์ƒํ™ฉ์— ์‚ฌ์šฉ
  • ์‹คํ–‰ ํŒŒ์ผ์ด๊ณ , ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์ด ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์ธ๋ฐ

    • ํŒŒ์ผ์„ openํ•ด์„œ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ณ  ์žˆ๊ณ ,
    • ๊ทผ๋ฐ ๋ฐ์ดํ„ฐ๋Š” ๋‚˜๋งŒ ์ฝ๊ณ  ์“ฐ๊ธฐ ํ•˜๊ณ ์‹ถ์€ ๊ฒฝ์šฐ
  • ํŒŒ์ผ ์ ‘๊ทผ ๊ถŒํ•œ ํ™•์ธ / ํŒŒ์ผ ์ข…๋ฅ˜ ํ™•์ธ

    //0400 Read USER
    if(s.st_mode&S_IRUSR)
      printf("์†Œ์œ ์ž ์ฝ๊ธฐ ๊ถŒํ•œ ์„ค์ •");
    
    //ํŒŒ์ผ ์ข…๋ฅ˜ ํ™•์ธ
    if(S_ISREG(s.st_mode))
      printf("์ผ๋ฐ˜ ํŒŒ์ผ")
    
      const char *get_filetype(struct stat *buf) {
      if(S_ISREG(buf->st_mode))
        return "regular";
      if(S_ISDIR(buf->st_mode))
        return "directory";
      if(S_ISCHR(buf->st_mode))
        return "charater";
      if(S_ISBLK(buf->st_mode))
        return "block";
      if(S_ISFIFO(buf->st_mode))
        return "fifo";
      return "unknown";
    }
  • access ์‹œ์Šคํ…œ ํ˜ธ์ถœ

    • ํŠน์ • ํŒŒ์ผ์— ๋Œ€ํ•œ ์ฝ๊ธฐ/์“ฐ๊ธฐ/์‹คํ–‰์ด ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•˜๋Š” system call

    • ์‚ฌ์šฉ๋ฒ•

      #include <unistd.h>
      int access(const char *pathname, int amode);
      • amode : R_OK , W_OK, X_OK, ๋˜๋Š” F_OK(ํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š”์ง€) F_OK | X_OK ํŒŒ์ผ ์กด์žฌํ•˜๊ณ , ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ์ง€ ๋‘˜ ๋‹ค ์ฐธ์ด๋ฉด 0, ํ•˜๋‚˜๋ผ๋„ ์•„๋‹ˆ๋ฉด -1
      • return ๊ฐ’ : 0 or -1
      • euid๊ฐ€ ์•„๋‹ˆ๋ผ uid์— ๊ทผ๊ฑฐํ•˜์—ฌ process๊ฐ€ file์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ์ง€๋ฅผ ํ‘œํ˜„
  • chmod ์‹œ์Šคํ…œ ํ˜ธ์ถœ

    • ํŠน์ • ํŒŒ์ผ์˜ access permission์„ ๋ณ€๊ฒฝํ•˜๋Š” system call

    • ์‚ฌ์šฉ๋ฒ•

      #include <sys/types.h>
      #include <sys/stat.h>
      int chmod(const char *pathname, mode_t mode);
      int fchmod(int fd, mode_t mode);
    • ์†Œ์œ ์ž๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•จ

  • link ์‹œ์Šคํ…œ ํ˜ธ์ถœ

    • ๊ธฐ์กด ํŒŒ์ผ์— ์ƒˆ๋กœ์šด ์ด๋ฆ„์„ ๋ถ€์—ฌํ•˜๋Š” system call

    • ์‚ฌ์šฉ๋ฒ•

      #include <unistd.h>
      int link(const char *orginal_path, const char *new_path);
    • return ๊ฐ’ : 0 or new_path๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์ด๋ฆ„์ด๋ฉด -1๋ฐ˜ํ™˜

    • ํ•œ ํŒŒ์ผ์— ํ•˜๋‚˜ ์ด์ƒ์˜ ์ด๋ฆ„. ํŒŒ์ผ์— ๋‘ ๊ฐœ ์ด์ƒ์˜ ์ด๋ฆ„์„ ๋ถ™์ผ ์ˆ˜ ์žˆ์Œ

      • link("a.c", "b.c") ์›๋ž˜๋Š” a.c ๋ผ๋Š” ์ด๋ฆ„ํ‘œ๊ฐ€ ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š”๋ฐ, b.c๋ผ๋Š” ์ด๋ฆ„ํ‘œ๋กœ ํ•˜๋‚˜ ๋” ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์ž„
      • (์‹œํ—˜๋ณผ ๋•Œ ๊ทธ๋ฆผ๊ทธ๋ฆฌ๋ผ๊ณ  ํ•˜๋ฉด ๋‘˜ ๋‹ค ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๋ชจ์Šต์„ ๊ทธ๋ ค์•ผํ•จ. a.c๋ฅผ ์›๋ž˜ ์ด๋ฆ„์ด๋ผ๊ณ  ํ•ด์„œ ํฌ์ธํ„ฐ๋กœ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ์•ˆ ๊ทธ๋ฆฌ๋ฉด ์•ˆ ๋จ)
      • ํŒŒ์ผ์— ์›๋ž˜ ์ด๋ฆ„์ด๋ž€ ๊ฒƒ์ด ๋”ฑ ์—†์–ด์„œ a.c, b.c ๋‘˜ ๋‹ค ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฒƒ์ž„
    • link count : link์˜ ์ˆ˜

    • unlink unlink("a.out")

      • link๋ฅผ ์ œ๊ฑฐ ํ•˜๋Š” ๊ฒƒ. link_countโ€” โ€”;
      • ํŒŒ์ผ์€ ์‚ญ์ œ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ unlink() ํ•จ์ˆ˜ ๊ธฐ๋Šฅ์œผ๋กœ ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ์ด๋ฆ„ํ‘œ ํฌ์ธํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๋Š”(unlink) ๊ฒƒ์ž„
      • ์ด๋ฆ„ํ‘œ ํฌ์ธํ„ฐ link๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๋ฉด ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ํฌ์ธํ„ฐ๊ฐ€ ์—†์–ด์„œ ํŒŒ์ผ์— ์ ‘๊ทผ์„ ๋ชปํ•˜๋Š” ๊ฒƒ์ž„
    • link_count๊ฐ€ 0์ด ๋˜๋ฉด free block์œผ๋กœ ์‹ค์ œ๋กœ ํŒŒ์ผ์ด ์ œ๊ฑฐ๋œ๋‹ค๊ณ  ํ•จ

    • ์˜ˆ์ œ

      $ vi test1
      //aaaaa
      //bbbbb
      //ccccc
      //ddddd
      //eeeee
      
      #include<stdio.h>
      #include<sys/types.h>
      #include<sys/stat.h>
      #include<fcntl.h>
      #include<unistd.h>
      
      int main() {
        link("test1", "test2");
        link("test1", "A/B/C/test3");
        return 0;
      }
    • test1์— ๋Œ€ํ•œ link test2, test3๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ด๋ ‡๊ฒŒ link์ˆ˜๊ฐ€ 3์œผ๋กœ ์—ฐ๊ฒฐ๋œ ์ด๋ฆ„ ์„ธ ๊ฐœ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๊ณ  terminal์•ฑ ์ž์ฒด์—์„œ ํŒŒ์ผ ์ด๋ฆ„ ์ƒ‰๋„ ๊ฐ™๊ฒŒ ํ‘œ์‹œํ•ด์ฃผ๊ณ  ์…‹ ์ค‘์— ํ•˜๋‚˜์˜ ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•ด๋„ ๋‹ค ๊ฐ™์ด ๋ฐ”๋€œ(์ˆ˜์ • ์‹œ๊ฐ„์ด ๊ฐ™์€ ๊ฒƒ์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ์Œ)

      [s13011022@bce LAB09-12]$ ls -l
      ํ•ฉ๊ณ„ 48
      drwxr-xr-x. 3 s13011022 class 4096  9์›” 12 20:13 A
      -rwxr-xr-x. 1 s13011022 class 8632  9์›” 12 16:55 a.out
      -rw-r--r--. 1 s13011022 class    6  9์›” 12 16:55 data
      -rw-r--r--. 1 s13011022 class  306  9์›” 12 16:55 example.c
      -rw-r--r--. 1 s13011022 class  183  9์›” 12 20:18 link.c
      -rwxr-xr-x. 1 s13011022 class 8512  9์›” 12 20:18 link.out
      -rw-r--r--. 3 s13011022 class   19  9์›” 12 20:20 test1
      -rw-r--r--. 3 s13011022 class   19  9์›” 12 20:20 test2
      
    • ๊ทธ๋ž˜์„œ link๋Š” ํŒŒ์ผ ํ•˜๋‚˜์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ด๋ฆ„ํ‘œ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ๋ณด๋ฉด ๋จ

  • symbolic link / ์ฃผ์˜ link์™€ ๋‹ค๋ฆ„. ์œˆ๋„์šฐ์—์„œ ๋ฐ”๋กœ๊ฐ€๊ธฐ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•˜์ง€๋งŒ ๋‘ ๊ฐœ๋Š” ๋‹ค๋ฆ„

    • link์˜ ์ œํ•œ์ 

    • ๋””๋ ‰ํ† ๋ฆฌ์— ๋Œ€ํ•œ link์ƒ์„ฑ ๋ถˆ๊ฐ€

    • ๋‹ค๋ฅธ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์žˆ๋Š” ํŒŒ์ผ์— ๋Œ€ํ•ด์„œ๋Š” link์ƒ์„ฑ ๋ถˆ๊ฐ€

    • ๊ทธ๋ž˜์„œ symbolic link ์ž์ฒด๊ฐ€ ํŒŒ์ผ์ธ, ๊ทธ ์•ˆ์— ๋‹ค๋ฅธ file์— ๋Œ€ํ•œ ๊ฒฝ๋กœ ์ˆ˜๋ก

    • ์‚ฌ์šฉ๋ฒ•

      #include <unistd.h>
      int symlink (const char *realname, const char *symname);
      • return ๊ฐ’ : 0 or symname์ด ์ด๋ฏธ ์กด์žฌํ•˜๋ฉด -1 ๋ฐ˜ํ™˜
    • ์˜ˆ์ œ. link ์˜ˆ์ œ ์ด์–ด์„œ

      $ vi test1
      //aaaaa
      //bbbbb
      //ccccc
      //ddddd
      //eeeee
      
      #include<stdio.h>
      #include<sys/types.h>
      #include<sys/stat.h>
      #include<fcntl.h>
      #include<unistd.h>
      
      int main() {
      	  symlink("test1", "test_sym");
      
      	  return 0;
      }
      [s13011022@bce LAB09-12]$ ls -l
      ํ•ฉ๊ณ„ 48
      drwxr-xr-x. 3 s13011022 class 4096  9์›” 12 20:13 A
      -rwxr-xr-x. 1 s13011022 class 8632  9์›” 12 16:55 a.out
      -rw-r--r--. 1 s13011022 class    6  9์›” 12 16:55 data
      -rw-r--r--. 1 s13011022 class  306  9์›” 12 16:55 example.c
      -rw-r--r--. 1 s13011022 class  215  9์›” 12 20:41 link.c
      -rwxr-xr-x. 1 s13011022 class 8568  9์›” 12 20:41 link.out
      -rw-r--r--. 3 s13011022 class   31  9์›” 12 20:40 test1
      -rw-r--r--. 3 s13011022 class   31  9์›” 12 20:40 test2
      lrwxrwxrwx. 1 s13011022 class    5  9์›” 12 20:42 test_sym -> test1
      
  • ์ด๋Ÿฐ ์ƒํƒœ์—์„œ test1, 2, 3๋Š” link๋กœ ๊ฐ™์€ ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์œผ๋‹ˆ test1, 2, 3 ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๋‹ค ๊ฐ™์ด ๋ณ€๊ฒฝ์ด ๋œ๋‹ค.

    $ vi test_sym
    //aaaaa
    
  • ๊ทผ๋ฐ test_sym ํŒŒ์ผ์„ vi๋กœ ๋ณ€๊ฒฝ์„ ํ•ด์„œ aaaaa๋งŒ ๋‚จ๊ฒจ๋‘๊ณ  ๋‚˜๋จธ์ง€๋ฅผ ๋‹ค ์ง€์šด๋‹ค

  • ๊ทธ๋ฆฌ๊ณ  ls -l ๋ช…๋ น์œผ๋กœ ํ™•์ธํ•ด๋ณด๋ฉด ์ˆ˜์ • ์‹œ๊ฐ„์ด test1, 2 , 3๋งŒ ๋ฐ”๋€Œ๊ณ  test_sym ํŒŒ์ผ ์ž์ฒด๋Š” ์ˆ˜์ • ์‹œ๊ฐ„์ด ๋ณ€๋™์ด ์•ˆ ๋ผ์žˆ๋‹ค

    • test_sym ํŒŒ์ผ์€ ์‚ฌ์‹ค์ƒ test1์ด๋ผ๋Š” ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ค๊ณ ๋งŒ ์žˆ๊ณ  ๋‚ด์šฉ์€ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค
    • test_sym์ด๋ผ๋Š” ํŒŒ์ผ์„ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด๋†“์€ ๊ฒƒ์ด๊ณ , test1์ด๋ผ๋Š” ์ด๋ฆ„ํ‘œ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š” ๊ฒƒ์ž„

6์ฃผ์ฐจ ์ฒซ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ํ•  ์˜ˆ์ •. 2์‹œ๊ฐ„ ์•ˆ์— ํ•ด๊ฒฐํ•˜๊ธฐ. ํ”„๋กœ์ ํŠธ ์‹œ ๋…ธํŠธ๋ถ ์‚ฌ์šฉ ์•ˆ ๋จ

  • readlink

  • symbolic file์•ˆ์— ์žˆ๋Š” ๋‚ด์šฉ์„ ๋ณด์—ฌ์คŒ

  • ์‚ฌ์šฉ๋ฒ•

    #include <unistd.h>
    int readlink (const char *sympath, char *buffer, size_t buffsize);
    char ch[100] = {0};
    readlink("test", ch, 99);
    printf("%s\n", ch);
    • return : ์„ฑ๊ณตํ•˜๋ฉด 0 / ์ด๋ฆ„์ด ๊ณต๊ฐ„๋ณด๋‹ค ํฌ๋ฉด ์•ˆ ๋œ๋‹ค๊ณ  ์•Œ๋ ค์คŒ -1 ๋ฐ˜ํ™˜
  • lstat

    • stat(test, ~) : test ์ •๋ณด๋ง๊ณ  test๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” A/B/C/test์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ค€๋‹ค. Symbolic link์˜ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป์ง€ ๋ชปํ•จ

    • lstat(test, ~) : symbolic link ์ž์ฒด ํŒŒ์ผ ์ •๋ณด๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

    • ์‚ฌ์šฉ๋ฒ•

      #include <sys/types.h>
      #include <sys/stat.h>
      int lstat (const char *linkname, struct stat *buf);
  • directory ์ƒ์„ฑ

    • Directory file์— .์™€ ..๋ฅผ ๋„ฃ์–ด์„œ ์ƒ์„ฑ

    • ์‚ฌ์šฉ๋ฒ•

      #include <sys/types.h>
      #include <sys/stat.h>
      int mkdir(const char *pathname, mode_t mode);
      mkdir("A", 0733);
    • directory์—์„œ์˜ permission์€ ์กฐ๊ธˆ ๋‹ค๋ฆ„

      • ์ฝ๊ธฐ 4 : directory ๋‚ด์˜ directory์™€ ํŒŒ์ผ๋“ค์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ
      • ์“ฐ๊ธฐ 2 : directory์™€ file์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค
      • ์‹คํ–‰ 1 : directory ์•ˆ์œผ๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. 1์ด ์—†๊ฒŒ ๋˜๋ฉด ๋“ค์–ด๊ฐ€์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋จธ์ง€ permission๋“ค์ด ์˜๋ฏธ๊ฐ€ ์—†์–ด์ง€๋‹ˆ๊นŒ, ๋‹ค๋ฅธ permission์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ™์ด ์จ์คŒ
  • directory ์ œ๊ฑฐ

    • directory๊ฐ€ ๋น„์–ด์žˆ๋Š” ๊ฒฝ์šฐ ์ œ๊ฑฐ ๊ฐ€๋Šฅ

    • ์‚ฌ์šฉ๋ฒ•

      #include <unistd.h>
      int rmdir(const char *pathname);
  • Rename

    • ์‚ฌ์šฉ๋ฒ•

      #include <stdio.h>
      int rename(const char *oldpathname, const char *newpathname);
    • newpathname์ด ์กด์žฌํ•ด๋„ -1์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Œ ๊ธฐ์กด file์„ ์ œ๊ฑฐํ•˜๊ณ  ์ƒˆ ์ด๋ฆ„ ๋ถ€์—ฌํ•˜๊ธฐ ๋•Œ๋ฌธ

    • file์€ ๊ทธ๋ ‡์ง€๋งŒ, directory์˜ ๊ฒฝ์šฐ์—๋Š” ํ•˜์œ„์— directory์™€ file์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ง€์›Œ์ง€์ง€ ์•Š์Œ

  • getcwd

    • current working directory

    • ์‚ฌ์šฉ๋ฒ•

      #include <unistd.h>
      char *getcwd(char *name, size_t size);
      ch[100] = {0};
      getcwd(ch, 99);
      printf("%s", ch);
    • return

      • Current working directory์˜ ๊ฒฝ๋กœ ์ด๋ฆ„ ๋ฐ˜ํ™˜
    • size๋Š” ์‹ค์ œ ๊ธธ์ด ๋ณด๋‹ค +1์ด ์ปค์•ผ ํ•œ๋‹ค

    • ๋งˆ์ง€๋ง‰ NULL ๋ฌธ์ž ๊ณ ๋ ค

    • ์„ฑ๊ณต ์‹œ directory์˜ ๊ฒฝ๋กœ ์ด๋ฆ„์ด name์— copy

      • ์‹คํŒจ ์‹œ null pointer return;
  • chdir

    • change directory

    • ์‚ฌ์šฉ๋ฒ•

      #include <unistd.h>
      int chdir(const char *path);
      fd1 = open(โ€œ/usr/ben/abcโ€, O_RDONLY);
      fd2 = open(โ€œ/usr/ben/xyzโ€, O_RDWR);
      
      ==> ์ด๊ฑธ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
      
      chdir(โ€œ/usr/benโ€);
      fd1 = open(โ€œabcโ€, O_RDONLY);
      fd2 = open(โ€œxyzโ€, O_RDWR);
      ch[100] = {0};
      
      mkdir("T1", 0700);
      chdir("T1");
      
      mkdir("T2", 0700);
      chdir("T2");
      
      mkdir("T3", 0700);
      chdir("T3");
      
      getcwd(ch, 99);
      printf("%s", ch);
      [s13011022@bce LAB09-17]$ ./example.out
      /home/account/class/tspark/s13011022/LAB09-17/T1/T2/T3
      [s13011022@bce LAB09-17]$ 
      
      • ์ด๋ ‡๊ฒŒ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ์ด ๋˜๋Š”๋ฐ, ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒํ•˜๋ฉด ์›๋ž˜ ์œ„์น˜๋กœ ๋ณต๊ท€ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค
      • LAB09-17์— ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค์™€ T3์— ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ์ž„
      • ์‰˜ ํ”„๋กœ์„ธ์Šค์—์„œ ๋ช…๋ น ํ•˜๋‚˜ํ•˜๋‚˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค child ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‰˜ ํ”„๋กœ์„ธ์Šค์™€ child ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ์‹คํ–‰๋˜๊ณ  ๋‹ค๋ฅธ ์—ญํ• ์„ ํ•จ
      • child๋Š” T3 ์œ„์น˜์— ๊ฐ€์žˆ์ง€๋งŒ, ์‰˜ ํ”„๋กœ์„ธ์Šค๋Š” ์› ์œ„์น˜์— ๊ทธ๋Œ€๋กœ ์žˆ์Œ
  • Directory ์—ด๊ธฐ ๋ฐ ๋‹ซ๊ธฐ

    • Directory ์—ด๊ธฐ ์‚ฌ์šฉ๋ฒ•

      #include <sys/types.h>
      #include <dirent.h>
      DIR *opendir(const char *dirname);
    • DIRํ˜•์˜ data structure์— ๋Œ€ํ•œ pointer๋ฅผ return. ์‹คํŒจ ์‹œ null pointer return

  • Directory๋Š” ์‚ฌ์‹ค ํŒŒ์ผ์ด๊ณ , ๋‚ด๋ถ€์— ๋ชฉ๋ก ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ

    • ๊ทธ๋ž˜์„œ ํŒŒ์ผ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” entry ์ •๋ณด๋ฅผ

    • ์šด์˜์ฒด์ œ๊ฐ€ entry ์ผ๋ถ€๋งŒ ๊ฐ€์ ธ์™€์„œ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด

    • P1์€ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  entry ๊ฐ’์„ ์ฐธ์กฐํ•œ๋‹ค ==> ์•ฝ๊ฐ„ ์ดํ•ด๊ฐ€ ์•ˆ ๊ฐ€์ง€๋งŒ ๊ณ„์† ์ฐพ์•„๋ณด๋‹ค๊ฐ€ ์งˆ๋ฌธ

    • Directory ๋‹ซ๊ธฐ ์‚ฌ์šฉ๋ฒ•

      #include <dirent.h>
      int closedir(DIR *dirptr);
  • Directory ์ฝ๊ธฐ

    • ์‚ฌ์šฉ๋ฒ•

      #include <sys/types.h>
      #include <dirent.h>
      struct dirent *readdir(DIR *dirptr);
    • return ๊ฐ’ : dirptr์ด ๊ฐ€๋ฆฌํ‚ค๋Š” DIR ๊ตฌ์กฐ๋‚ด์˜ ํ•œ ํ•ญ

    • struct dirent

      • ino_t d_ino

      • char d_name[]

        struct dirent {
          ino_t d_ino;				//inode number
          off_t d_off;				//offset to the next dirent
          unsigned short d_reclen;	//length of this record
          unsigned char d_type;		//type of file. not supported by all file system types
          char d_name[256];			//filename
        }
    • pointer dirptr์€ read ํ›„ ๋‹ค์Œ ํ•ญ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

    • directory์˜ ๋์— ๋„๋‹ฌํ•˜๋ฉด null pointer๋ฅผ return

    • ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ ํŒŒ์ผ๊ณผ dir์ •๋ณด ์ถœ๋ ฅ ์‹ค์Šต ์˜ˆ์ œ

      int main() {
        DIR *dp;
        struct dirent *d;
        dp = opendir(".");
        d = readdir(dp);
        while(d != NULL) {
          printf("%ld : %s \n", d->d_ino, d->d_name);
          d = readdir(dp);
        }
        return 0;
      }
  • Directory ํŒŒ์ผ ์ฝ์–ด์˜ค๋Š” ๊ณผ์ •

    ํ•˜๋“œ๋””์Šคํฌ OS P1
    ํŒŒ์ผ์ด ์›๋ž˜ ์žˆ๋Š” ๊ณณ ์—ฌ๊ธฐ์—์„œ ํŒŒ์ผ ํ•œ ๋ฉ์–ด๋ฆฌ๋ฅผ ๊ฐ€์ ธ์™€์„œ OS์— ์ €์žฅ dp = opendir(".");
    ํŒŒ์ผ ์ •๋ณด๋Š” ์šด์˜์ฒด์ œ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์Œ dp ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ํŒŒ์ผ์— ์ ‘๊ทผํ•œ๋‹ค
    entry ๊ตฌ์กฐ์ฒด ํ˜•ํƒœ : id, name d = readdir(dp);
    d ํฌ์ธํ„ฐ ์ฃผ์†Œ๋งŒ ๊ฐ€์ ธ์™€์„œ entry์— ์ ‘๊ทผ
  • Directory file pointer ์ด๋™

    • ์‚ฌ์šฉ๋ฒ•

      #include <sys/types.h>
      #include <dirent.h>
      void rewinddir(DIR *dirptr);
    • Directory๋ฅผ ์™”๋‹ค๊ฐ”๋‹ค๊ฐ€ ์ด๋™์„ ํ•˜๊ณ  ์‹ถ์€๋ฐ, directory ํŒŒ์ผ์€ lseek๋ช…๋ น ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ ์ ˆํ•˜์ง€ ์•Š์Œ

      • d->d_ino์˜ ๊ฐ’์€ ์ผ์ •ํ•œ ํฌ๊ธฐ์ด์ง€๋งŒ,
      • d->d_name์€ ์ด๋ฆ„์ด ๊ธธ๊ณ  ์งง๊ณ  ๋ถˆ๊ทœ์น™ํ•ด์„œ entryํ•˜๋‚˜ํ•˜๋‚˜๊ฐ€ ์ผ์ •ํ•˜์ง€์•Š์Œ
  • ๊ทธ๋ž˜์„œ entry ํ•˜๋‚˜์˜ ํฌ๊ธฐ๋ฅผ ์ง์ ‘ ์ฝ์–ด์˜ค๊ธฐ ์ „๊นŒ์ง€๋Š” ์•Œ ์ˆ˜ ์—†์Œ

    • ๊ทธ๋ž˜์„œ rewinddir ์‹œ์Šคํ…œ ์ฝœ ์‚ฌ์šฉ