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
-
์์งํ ๋ชจ๋
- 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๋ง๊ณ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์กฐํ๋ฅผ ํ๋ฉด ์ ๋๋ ์ํฉ์ ์ฌ์ฉ
- ๊ทธ๋ฅ dataํ์ผ์ 0644 permission์ ๋ถ์ฌํ๋ฉด ๋์ง ์๋๊ฐ ์๊ฐํ ์ ์์ง๋ง ์ด๊ฑด ๋๋ฌด ์์ผํ ์๊ฐ์. ๊ทธ๋ฌ๋ฉด ๋ค๋ฅธ์ฌ๋๋ค์ด dataํ์ผ์ cat ๋ช
๋ น์ผ๋ก ํ์ธ ๊ฐ๋ฅํจ. ๊ฐ๋ น ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ ํ๋ก๊ทธ๋จ
-
์คํ ํ์ผ์ด๊ณ , ์ฌ๋ฌ ์ฌ๋์ด ์คํ์ํฌ ์ ์๋ ํ๋ก๊ทธ๋จ์ธ๋ฐ
- ํ์ผ์ 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์ ์ ๊ทผ ๊ฐ๋ฅํ์ง๋ฅผ ํํ
- amode : R_OK , W_OK, X_OK, ๋๋ F_OK(ํ์ผ์ด ์กด์ฌํ๋์ง)
-
-
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 ์์คํ ์ฝ ์ฌ์ฉ