Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Be realist

Linux system calls & funtions 본문

Linux

Linux system calls & funtions

realist 2018. 4. 10. 04:08
open()

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

Int open( const char *pathname, int flags);
Int open( const char *pathname, int flags, mode_t mode);

기존 파일을 열거나, 새로운 파일을 생성하는 함수이다.

Pathname 인자에는 open할 파일명에 대한 절대경로, 혹은 상대경로를 넣어 주면 된다. 
flags 인자에는 파일을 어떤 목적으로 open할 것이며, 파일의 초기화 여부 등을 넣어 주게 된다. 

O_RDONLY : 읽기전용 open
O_WRONLY : 쓰기전용 open
O_RDWR : 읽기&쓰기 모두 가능한 open

flag 인자 자리에는 위 세 개중 하나가 반드시 설정되어야 한다. 

아래 상수들은 파이프라인을 통해서 추가적으로 여러개 설정할 수 있다. 주요 옵션들에 대한 설명만 간략히 기술하였다. 

O_APPEND : 파일을 append mode로 open. write함수를 통해 파일쓰기를 수행하면 파일 쓰기 위치에 관계없이 자동으로 파일의 끝에 쓰게 되는데, 만약 여러개의 프로세스가 동시에 하나의 파일을 append mode로 열었다면 프로세스간에도 중복쓰기를 하지 않고 오로지 파일의 끝에만 write하게 된다. 

O_CREAT : 파일이 존재하지 않으면 새로운 파일을 생성하라는 설정, 이 옵션이 설정되면 mode를 입력받는 open함수를 호출해야 한다. 

O_DIRECT : I/O시 커널 버퍼에 캐싱하지 않고 바로 디스크에 read/write하라는 설정. 
O_EXCL : O_CREAT와 함께 사용되며, 이미 파일이 존재하면 오류(-1)를 return한다.

mode : 파일에 대한 액세스 권한을 설정한다.

S_IRWXU : (00700) OWNER 에 대한 읽기, 쓰기, 실행권한 모두 설정
S_IRUSR : (00400) OWNER 에 대한 읽기 권한
S_IWUSR : (00200) OWNER 에 대한 쓰기 권한
S_IXUSR : (00100) OWNER 에 대한 실행 권한 
S_IRWXG : (00070) GROUP 에 대한 읽기, 쓰기, 실행권한 모두 설정

이하 다른 옵션도 위와 같은 패턴이다. R(읽기) W(쓰기) X(실행), RW(읽기/쓰기/실행), U(OWNER), G(GROUP), O(OTHER) 로 대입하여 옵션을 주면 된다. 

return 값은 열려진 파일의 fd이다. -1이 반환되면 오류가 발생한 것인데, 오류 내용은 errno에 설정되므로 strerror(errno)를 출력하여 상세한 오류 내용을 확인할 수 있다. 


read()

#include <unistd.h>
ssize_t read( int fd, void *buf, size_t count);

open(), creat(), socket(), accept() 등으로 생성한 fd로부터 데이터를 읽는다.
파일을 읽으면 size만큼 파일의 다음 읽을 위치가 이동된다. 읽을 위치가 파일의 끝에 도달하면 더 이상 읽을 데이터가 없으므로 0을 return 한다. 

fd 파라미터에는 정상적으로 open된 file descriptor가 들어간다.
buf 에는 읽을 데이터를 저장할 버퍼가 들어간다. 
count 에는 읽을 데이터의 byte 수가 들어간다. 

0이상의 값이 반환되면, 실제로 읽은 데이터 byte 수를 의미한다. 일반적으로 count와 같은 값을 반환하지만, count 보다 작은 경우에는 EOF에 도달하였음을 의미한다. (0이 리턴되었을 경우를 포함)

-1이 반환되면 오류가 발생한 것인데, 오류 내용은 errno에 설정되므로 strerror(errno)를 출력하여 상세한 오류 내용을 확인할 수 있다.  


write()

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);

open(), creat(), socket(), accept() 등으로 생성한 fd로부터 데이터를 쓰거나 전송한다. 
파일에 쓰기를 하면 파일의 쓰기 또는 읽기 위치가 쓴 size만큼 뒤로 이동한다.
만약 O_APPEN flag로 파일을 open 했다면, 현재 위치가 아닌 항상 파일의 끝에 쓰기가 일어난다. 

fd 파라미터에는 정상적으로 open된 file descriptor가 들어간다.
buf 에는 쓰기를 할 버퍼가 들어간다. 
count 에는 쓸 데이터의 byte 수가 들어간다.  

0 이상의 값이 반환되면, 실제로 쓴 데이터의 byte수를 의미한다. 일반적으로 count와 같은 값을 반환하지만, count 보다 작은 경우에는 signal이 발생하였거나 쓰기 공간이 부족한 경우이다. 

-1이 반환되면 오류가 발생한 것인데, 오류 내용은 errno에 설정되므로 strerror(errno)를 출력하여 상세한 오류 내용을 확인할 수 있다.  


lseek()

#include <sys/types.h>
#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);

read/write할 file의 위치를 이동하거나, 현재 파일의 read/write할 위치를 얻는 함수이다.

stdio.h의 ftell 함수와 같이 read/write할 위치를 얻는 시스템콜 함수는 없으며,
lseek(fd, 0, SEEK_CUR);의 return 값으로 현재 위치를 얻을 수 있다. 

만약 파일의 크기보다 큰 위치로 이동되어도 오류가 발생하지 않으며 파일의 크기도 바뀌지 않는다.
파일의 끝을 벗어난 곳에서 write()를 호출하면 그 위치에서 파일의 write가 진행되며
기존의 파일의 끝과 write한 곳 사이에는 0x00으로 값이 설정된다.

fd는 open() 또는 creat()를 통하여 얻은 file descriptor
offset 은 whence로부터 이동할 상대 위치로, +-값을 가질 수 있으며 byte단위의 위치이다.
whence가 SEEK_SET인 경우는 -값을 가질 수 없으며, offset 값이 곧 이동할 위치이다. 

whence : offset 값의 상대 위치를 어디에서 시작할 것인지를 지정하는 값이다. 

SEEK_SET :  파일의 시작에서 offset 만큼 이동한다. offset값이 파일의 읽기/쓰기의 위치로 지정된다.
SEEK_CUR : 현재 읽기/쓰기 위치 기준으로 offset값을 더한 위치로 이동한다.
SEEK_END : 파일의 끝을 기준으로 offset값을 더한 위치로 이동한다


0이상의 값이 반환되면, 변경된 파일에 대한 읽기/쓰기 위치 정보를 의미한다(파일의 시작부터의 OFFSET을 의미)
-1이 반환되면 오류가 발생한 것인데, 오류 내용은 errno에 설정되므로 strerror(errno)를 출력하여 상세한 오류 내용을 확인할 수 있다.


close()

#include <unistd.h>

int close(int fd);

open() 또는 creat() 통하여 open 파일을 닫는다


fd는 open() 또는 creat()를 통하여 얻은 file descriptor
0이 반환되면, 정상적으로 file을 close함을 의미한다. -1이 반환되면 오류가 발생한 것인데, 오류 내용은 errno에 설정되므로 strerror(errno)를 출력하여 상세한 오류 내용을 확인할 수 있다.


memalign()

#include <malloc.h>

void *memalign(size_t alignment, size_t size);

인자로 지정한 정렬 기준과 크기에 맞는 메모리 영역을 할당하여 반환한다.
반환값은 할당된 메모리의 포인터이다, 요청이 실패하면 NULL을 리턴한다.