파일의 ‘상태’에 대한 정보를 얻거나 설정
#include <sys/stat.h>
#include <sys/types.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
struct stat buf;
if(argc > 1)
{
printf("Arguments is not allowed! \n");
return 1;
}
printf("argv[0]: %s \n", argv[O]);
stat(argv[0], &buf);
printf("Mode: %lo \n", (unsigned long)buf.st_mode); // Type & Protection
printf("UID: %d \n", (int)buf.st_uid); // User ID of the File
printf("Size: %d \n", (int)buf.st_size); // Size of the File
printf("Modification Time: %d \n", (int)buf.st_mtime); // Latest Modification Time
return 0;
}
Mode는 파일 타입과 접근 허가(=파일 속성)
assist@assist-VirtualBox:~/Unix_Programming$ ls -l fstat
-rwxr-xr-xX 1 assist assist 8496 10월 1 19:07 fstat
assist@assist-VirtualBox:~/Unix_Programming$ fstat
argv[®]: fstat
Mode: 100755
UID: 10660
Size: 8496
Modification Time: 1569924462
Mode가 100755라는 의미 중 앞의 100~은 위 그림의 S_IFREG 즉 regular file이라는 의미이다.
하드 링크 (Hard Link)
심볼릭 링크 (Symbolic Link)
<unistd.h>
int link(const char *old, const char *new)
int unlink(const char *path)
리턴 값 : 0이면 성공, 아니면 실패
#include <unistd.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
if(arge != 3)
{
perror("Usage: ./mv <old> <new> \n");
return -1;
}
if(link(argv[1], argv[2]))
{
printf("Link failed. : %s -> %s \n", argv[1], argv[2]);
return -2;
}
/*
if(unlink(argv[1]))
{
printf("Unlink failed. : %s \n", argv[1]);
return -3;
}
*/
printf("File moved: %s -> %s \n", argv[1], argv[2]);
return 0;
}
assist@assist-VirtualBox:~/Unitx_Programming$ ls -1 fstat
-rwxr-xr-xX 1 assist assist 8496 10월 1 19:07 fstat
assist@assist-VirtualBox:~/Unix_Programming$ ./mv fstat fstat2
File moved: fstat -> fstat2
assist@assist-VirtualBox:~/Unix_Programming$ ls -l fstat*
-rwxr-xr-x 2 assist assist 8496 10월 1 19:07 fstat
-rw-r--r-- 1 assist assist 558 10월 1 19:07 fstat.c
-rwxr-xr-x 2 assist assist 8496 10월 1 19:07 fstat2
fstat 파일의 link count가 1에서 2로 증가하고, fstat2도 link count가 2인 것을 확인
<sys/types.h>, <sys/stat.h>
int mkdir(const char *pathname, mode_t mode)
#include <sys/stat.h>
#include <sys/types.h>
int main(int argc, char* argv[])
{
int i;
for(i = 1 3; i < argc ; ++i)
mkdir(argv[i], 0777);
return 0;
}
assist@assist-VirtualBox:~/Unix_Programming$ ./md dir1 dir2
assist@assist-VirtualBox:~/Unix_Programming$ ls -1
합계 120
-rwxr-xr-x 1 assist assist 8440 10월 1 21:45 cd
-rw-r--r-- 1 assist assist 345 10월 1 22:26 cd.c
drwxr-xr-x 2 assist assist 4096 10월 1 22:30 diri
drwxr-xr-x 2 assist assist 4096 10월 1 22:30 dir2
코드에서 permission을 0777로 작성했으나 생성된 permisison은 0755이다.
이는 defulat umask가 0022이기 때문이다.
chmod(파일명, 권한)
umask(마스크)
실제 결과는 open()을 해야 확인 가능하다
#include <sys/stat.h>
#include <sys/types.h>
int main(int argc, char* argv[])
{
int i;
umask(0000); // mask: 000
for(i = 1 ; i < argc ; ++i)
mkdir(argv[i], 0777);
return 0;
}
assist@assist-VirtualBox:~/Unix_Programming$ ./md dir_md
assist@assitst-VirtualBox:~/Unix_Programming$ ./md_umask dir_md_umask
assist@assist-VirtualBox:~/Unix_Programming$ ls -1
합계 88
drwxr-xr-x 2 assist assist 4096 10월 1 20:58 dir_md
drwxrwxrwx 2 assist assist 4096 10월 1 20:58 dir_md_umask
-rwxr-xr-x 1 assist assist 8296 10월 1 20:43 md
-rw-r--r-- 1 assist assist 155 10월 1 26:43 md.c
<unistd.h>
int rmdir(const char *pathname)
#include <stdio.h>
#include <unistd.h>
int main(int argc, char* argv[])
{
int i, res;
dup2(1, 2); // stderr에 stdout 덮어씀
for(i = 1; t < argc ; ++i)
{
res = rmdir(argv[i]);
if(res)
printf ("rmdir for %s failed. \n", argv[i]);
}
return 0;
}
unix@unixsystem:~$ ls -1
total 32
drwxr-xr-x 2@ unix unix 4096 Oct 13 20:18 dir1
drwxr-xr-x 2 unix unix 4096 Oct 13 20:18 dir2
-rwxr-xr-x 2 unix unix 5016 Oct 13 20:09 md
-rw-r--r-- 41 unix unix 157 Oct 13 20:08 md.c
-rwxr-xr-x 2 unix unix 5157 Oct 13 20:18 rm
-rw-r--r-- 1 unix unix 215 Oct 13 20:17 rm.c
unix@unixsystem:~$ ./rm diri dir2 dir3
rmdir for dir3 failed.
unix@unixsystem:~$ ls -1
total 24
-rwxr-xr-x 1 unix unix S016 Oct 13 20:09 md
-rw-r--r-- 1 unix unix 157 Oct 13 20:08 md.c
-rpwxr-xr-x% 1 unix unix 5157 Oct 13 20:18 rm
-rw-r--r-- 2 unix unix 215 Oct 13 20:17 rm.c
unix@unixsystem:~$ _
<unistd.h>
int chdir(const char *pathname)
int fchdir(int fd)
<unistd.h>
char* getcwd(char *name,size_t size)
#finclude <unistd.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
char name[256];
int i, res;
printf ("Current Dir.: %s \n", getcwd(name, 256));
for(i = 1; i < arge ; ++i)
{
res = chdir(argv[i]);
if(res)
printf("Chdir for %s failed. \n", argv[i]);
else
printf("Current Dir.: %s \n", getcwd(name, 256));
}
return 0;
}
unix@unixsystem:~$ ./cd /tmp /var /usr/include ~
Current Dir. : /home/unix
Current Dir. : /tmp
Current Dir. : /var
Current Dir. : /usr/include
Current Dir. : /home/unix
unix@unixsystem:~$ _
Unix에서는 모든 것을 파일로 관리함
디렉터리는 특수한 형태의 파일
디렉터리 엔트리는 디렉터리를 표현하는 데에 쓰이는 자료구조
디렉터리에 속한 파일들은 디렉터리 엔트리, 구조체로 관리
struct dirent
{
#ifndef __USE_FILEOFFSET64 // 64비트 사용
__ino_t d_ino; // 파일 엔트리 번호(inode)
__off_t d_off; // 파일 오프셋 (offset)
#else // 32비트 사용
__ino64_t d_ino; // inode (64비트 강제)
__off64_t d_off; // offset (64비트강제)
#endif
unsigned short int d_reclen; // 파일 이름의 길이
unsigned char d_type; // 파일 타입
char d_name [256] ; // 파일 이름
};
<dirent.h>
DIR *opendir(const char *pathname)
int closedir(DIR *dirp)
<dirent.h>
struct dirent *readdir(DIR *dirp)
void rewinddir(DIR *dirp)
#include <dirent.h>
#include <stdio.h>
int main(int argc, char* argv[]){
int res, depth = 0;
DIR* dirp;
struct dirent* entry;
if(arge != 2){
perror("Usage: list <path> \n");
return -1;
}
dirp = opendir(argv[1]);
if(dirp == NULL){
perror("Directory cannot be opened. \n");
return -2;
}
while((entry = readdir(dirp)) != NULL)
printf("%101ld : %s \n", entry->d_ino, entry->d_name);
closedir(dirp);
return 0;
}
unix@unixsystem:“$ ./list .
570 : ..
293 : md.c
294 : cd.c
450 : cd
452 : list
1055 : .bash_history
4610 : .
321 : rm.c
26205 : .profile
31360 : .bashre
384 : rm
432 : md
33103 : .bash_logout
326 : list.c
unix@unixsystem:~$ —
현재 디렉터리에 대한 inode 번호와 파일명이 모두 표시
(현재와 상위 디렉터리도 표시)
Ctrl + Z
assist@assist-VirtualBox:~/Unix_Programming$ ./bg
Knock!
^Z
[1]+ Stopped
assist@assist-VirtualBox:~/Unix_Programming$
&
assist@assist-VirtualBox:~/Unix_Programming$ ./bg &
[2] 16871
Knock!
assist@assist-VirtualBox:~/Unix_Programming$
Knock!
jobs
assist@assist-VirtualBox:~/Untix_Programming$ jobs
[1]+ Stopped ./bg
[2]- Running ./bg &
job 명령어에는 다음과 같은 상태들이 있다
bg %(ID)
assist@assist-VirtualBox:~/Unix_Programming$ jobs
[1]+ Stopped ./bg
[2]- Running ./bg &
assist@assist-VirtualBox:~/Unix_Programming$ bg %1
[1]+ ./bg &
Knock!
assist@assist-VirtualBox:~/Unix_Programming$ Knock!
Knock!
Knock!
fg %(ID)
assist@assist-VirtualBox:~/Unix_Programming$ fg %1
./bg
Knock!
jobs
Knock!
Knock!
kill
assist@assist-VirtualBox:~/Unix_Programming$ jobs
[2]+ Running ./bg &
assist@assist-VirtualBox:~/Unix_Programming$ kill %2
[2]+ Done ./bg
assist@assist-VirtualBox:~/Unix_Programming$ jobs
assist@assist-VirtualBox:~/Unix_Programming$
kill -9
-9 옵션은 강제종료(권장 X)
assist@assist-VirtualBox:~/Unix_Programming$ vi &
[1] 17614
assist@assist-VirtualBox:~/Unix_Programming$ jobs
[1]+ Stopped vi
assist@assist-VirtualBox:~/Unix_Programming$ kill -9 %1
[1]+ Killed vi
assist@assist-VirtualBox:~/Unix_Programming$ jobs
assist@assist-VirtualBox:~/Unix Programming$