본문 바로가기
운영체제/리눅스

[리눅스] 파일 I/O _1

by Cloud_Park 2022. 7. 31.

2022.07.31 - [운영체제/리눅스] - [리눅스] 쉘스크립트_1

2022.07.31 - [운영체제/리눅스] - [리눅스] 쉘스크립트_2(awk,sed)

파일 I/O

파일은 리눅스 운영체제에서 가장 기본적이고 핵심이 되는 추상화 개념

파일 디스크립터( file descritor)란?

파일 디스크립터는 프로세스의 열림 파일을 고유하게 식별하는 정수

파일 디스크립터 테이블( file descriptor table)

파일 디스크립터는 파일 테이블 엔트리들을 가르키는 파일 요소이고, 이 파일 디스크립터를 가르키는 정수 배열의 집합을 파일디스크립터 테이블이라고합니다.

운영체제는 각 프로세스마다 하나의 고유한 파일 디스크립터 테이블이 제공됩니다.

파일 테이블 엔트리(file table entry)

파일 테이블 엔트리는 메모리내에 존재하는 열린 파일에 대한 구조체입니다.

이는 파일을 열거나 파일 위치를 유지 보수할 때 생성 됩니다.

표준 파일 디스크립터 (standard File Descriptor)

-프로세스가 시작되면 해당 프로세스 파일 디스크립터 테이블의 파일 디스트립터 0,1,2가 자동으로 열립니다.

-0(stdin): 키보드에서 문자를 쓸 때마다 fd 0 을 통해 stdin으로 읽어 들입니다.

-1(stdout): fd 1을 통해 화면의 stdout에 쓸 때마다 화면 출력에 나타납니다.

-2(stderr): fd 2를 통해 화면의 stderr에 쓸 때마다 화면에 에러 출력이 나타납니다.

 

 

파일 생성 관리 (creat)

 

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

int create(const char *pathname, mode_t mode);

 

파일을 위해 creat()또는 open() 등 이용

create() 함수는 이미 존재하는 파일의 경우 초기화 시키거나 존재하지 않는 파일을 생성 시 사용

-open()함수에 O_CREAT |O_WRONLY|O_TRUNC 플래그 세팅과 동일

path_name은 생성하거나 열고자 하는 파일 이름을 나타낸다.

보통 full path 이름을 적어주며, 단지 파일이름만 적을 경우에는 현재 경로에서 찾는다.

mode 인자는 파일 생성 시 파일의 권한(소유권)을 나타낸다.

정상 수행 시 파일 디스크립터 리턴, 에러발생시 -1 (errno)

File mode bits:
mode

S_IRWXU : 00700 모드로 파일 소우자에게 읽기 쓰기  살행권한
S_IRUSR : 00400 으로 사용자에게 읽기 권한
S_IWUSR : 00200 으로 사용자에게 쓰기 권한
S_IXUSR : 00100 으로 사용자에게 실행 권한

S_IRWXG : 00070 으로 그룹에게 읽기 쓰기 실행권한
S_IRGRP : 00040 으로 그룹에게 읽기 권한
S-IWGRP : 00020 으로 그룹에게 쓰기 권한
S_IXGRP : 00010 으로 그룹에게 실행 권한

S_IRWXO : 00007 으로 기타 사용자에게 읽기 쓰기 실행 권한
S_IROTH : 00004 으로 기타 사용자에게 읽기 권한
S_IWOTH : 00002 으로 기타 사용자에게 쓰기 권한
S_IXOTH : 00001 으로 기타 사용자에게 실행 권한

*스티키 비트는 인터넷으로 검색

예제

#include <stido.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>

int main(){

int fd;
mode_t mode = S_IRUSR |S_IWUSR |S_IRGRP | S_IROTH;
char *filename = "/tmp/file";

fd=creat(filename,mode);
	if(fd<0){
		printf("creat error: %s\n",strerror(errno));
		return -1
	}
	return 0;
}


#######
gcc -g 파일이름.c -o 파일이름.o

 

 

파일 생성 및 관리 (access)

#include <unistd.h>
int access(const char *pathname,int mode);

access()는 호출 프로세스가 파일경로 이름에 엑세스 할 수 있는지 확인합니다.

mode

정상 수행 시 파일 0 리턴, 에러 발생시 -1 리턴(errno)

#include <stdio.h>
#include <unistd.h>

int main(){

	char *pathname="./creat_example";
	int mode= R_OK | W_OK ;
	
	if(access(pathname,mode) ==0 )
		printf("Read Write OK \n")
	else
		printf("You do not have permission or do not exist \n")

	return 0;
}

 

 

파일 생성 및 관리(stat)

switch (sb.st_mode & S_IFMT){

	case S_IFBLK:
		printf("block device node\n");
	case S_IFCHR:
		printf("character device node\n");
	case S_IFDIR:
		printf("dirctory\n");
	case S_IFIFO:
		printf("FIFO\n");
	case S_IFLNK:
		printf("symbolic link\n");
	case S_IFREG:
		printf("regular file\n");
	case S_IFSOCK:
		printf("socket\n");
	default:
		printf("unknown\n");


}

 

 

권한 (permission)

#include <sys/stat.h>
int chmod(const char *pathname,mode_t mode);

경로명이 지정된 파일의 모드를 변경합니다.

정상 수행 시 파일 0 리턴, 에러 발생 시 -1 리턴(errno)

#include <stdio.h>
#include <unistd.h>

int main(){
	char *filename="./creat_example";
	int mode=F_OK;

	if(access(filename,mode)==0){
		if(chmod(filename,S_IRWXU|S_IRWXG)!=0){
			printf("chmod() erron");
			return -1;
			} 
		}else {
			printf("file(%s) access erron\n",filename);
			return -1;
			
		}
	
	return 0;
}


#####
$ gcc -g filename.c -o filename.o
$ ./filename

 

 

소유권(Ownership)(chown)

#include <unistd.h>
int chown(const char *pathname,uid_t owner,gid_t group);

경로 이름으로 지정된 파일의 소유권을 변경합니다.

정상 수행 시 리턴값 0, 에러발생 시 -1

#include <stdio.h>
#include <unistd.h>

int main(){
	char *filename="./creat_example";
	int mode=F_OK;

	if(access(filename,mode)==0){
		if(chown(filename,1,2)!=0){
			printf("chown() erron");
			return -1;
			} 
		}else {
			printf("file(%s) access erron\n",filename);
			return -1;
			
		}
	
	return 0;
}


#####
$ gcc -g filename.c -o filename.o
$ ./filename