MKNOD
형태 : #mknod [option] 디바이스 파일명 {bcu}주번호 부번호
옵션 :[-m mode] [--mode=mode] [--help] [--version]
옵션 : -m, --mode mode :생선된 파일의 모드를 지정하는 옵션이다. mode로 사용할 것은 chmod에서 사용하는
기호나 숫자 형식이다.
--help:도움말을 보여주고 마친다.
--version :버전 정보를 보여준다.
설명 : mknode명령은 FIFO,문자 디바이스 파일, 블록 디바이스 파일 등을 만드는세 사용된다. 초기값으로 만들어
지는 파일모드는 0666이다. 디바이스 파일명 인자를 쓴후 그 파일의 특수 형태를 알리는 값을 지정해야 한다.
여기서 사용할 수
있는 값은 다음과 같다.
-p:FIFO
-b:블록 디바이스 파일
-c 또는 u:문자 디바이스 파일
블록이나 문자 특수 파일을 만들 경우에는 그디바이스 파일의 주 번호롸 부 번호를 지정해야한다.
OPEN()
형태 : #include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname,int flags);
설명 : pathname에 지정된 문자열로 표현되는 디바이스 파일을 flags에 지정된 속성으로 연다.
일반적으로 pathname에 지정되는 위치는 '/dev/;디렉토리에 있는 디바이스 파일이다.
매개변수 : *pathname : 디바이스 파일을 지정하는 문자열의 주소를 지정한다.
*flags : 디바이스 파일에 접근하기 위한 속성을 지정한다.
-O_RDONLY : 읽기 전용으로 연다.
-O_WRONLY : 쓰기 전용으로 연다
-O_RDWR : 읽기 쓰기가 가능하게 연다.
-O_NOCTY : 디바이스 파일이 터미널 디바이스 일때 시리얼 디바이스로 속성을 바꾼다.
-O_NONBLOCK : 파일은 비블록 모드로 열린다.
-O_NDELAY : 파일은 비블록 모드로 열린다.
-O_SYNC : 파일은 입출력 동기화를 위해 열린다. 디바이스에 쓴 내용이 하드웨어에 기록 될때 까지
호출 프로세스는 블록 상태가 된다.
반환값 : 열기에 성공하면 파일 디스크립터를 반환하고 실채하면 -1을 반환한다. -1을 얻었을때는 전역 변수인
error값을 참조하면 실제 디바이스 드라이버에서 반환한 값을 확인할수있다.
*error 값
- ENXIO : 파일이 디바이스 파일이고, 일치하는 디바이스가 없다.
- ENODEV : 디바이스 파일에 관련된 디바이스 드라이버가 없거나 하드웨어가 없다.
- ENOMEM : 커널 메모리가 부족하다.
close()함수
기능 : 디바이스 파일을 닫는다.
형태 : #include <unistd.h>
int close(int fd);
설명 : 디바이스 파일을 열기 위해 사용한 open() 함수에서 반환한 파일 디스크립터에 해당하는
디바이스 파일을 닫는다.
매개변수 : *fd:open()함수 실행 결과로 반환된 파일 디스크립터
반환값 : 닫기에 성공하면 0, 실패하면 -1을 반환한다.
READ() 함수
기능 : 디바이스 파일에서 데이터를 읽는다.
형태 : #include <unistd.h>
ssize_t read(int fd,void *buf,size_t count);
설명 : fd에 해당하는 디바이스 파일에서 데이터를 count만큼 읽어와 buf가 가리키는 주소에 넣는다.
이때 count
값은 SSIZE_MAX보다 작아야 한다. 이 함수는 open()함수에서 O_NONBLOCK,O_NDELAY가
지정되지 않는
경우에는 count 값의 크기에 해당하는 데이터가 읽혀질 때까지 블록된다. 디바이스 파일의
디바이스 드라이버가
O_NONBLOCK,O_NDELAY에 대해 구현하지 않을경우는 잘못된 디바이스 드라이버다.
프로그램을 작성할 떄는 이런 경우에도
대비해야 하기 때문에 반환되는 결과값을 확인해야 한다. 이 함수의
실행 결과로 파일 포인터의 위치는 읽은 수만큼 이동한다.
매개 변수 : *fd:open()함수 실행 결과로 반환된 파일 디스크립터
*buf : 읽은 데이터가 저장될 공간의 주소. 이 주소가 가리키는 저장 공간의 크기는 count값보다 커야함
* count : 디바이스 파일에서 읽어올 데이터의 크기. 이 크기는 SSIZE_MAX 보다 작게 지정해야 한다.
이값이 0이면 즉시 실행이 종료된다.
반환값 : 디바이스 파일에서 데이터를 정상적으로 읽었다면 읽은 바이트 수를 반환한다. 만일 이 값 이 요구된
바이트의 수보다 작더라도 에러는 아니다. 이는 실제로 즉시 이용할 수 있는 바이트가 거의 없기 때문이거나
어떤 신호에 의해 인터럽트되었기 때문이다. 실패하면 -1 을 반환한다. -1을 얻었을 때는 전역 변수인
ERROR값을 참조하면 실제 디바이스 드라이버에 서 반환한 값을 확인할 수 있다.
* error 값
- EINTR: 어떤 데이터를 읽기도 전에 함수가 신호에 의해 인터럽트 되었다.
- EAGAIN: O_NONBLOCK으로 열렸지만 read 호출 시에 즉시 읽을 수 있는 데이터가 없다.
- EIO: 디바이스 파일에서 데이터를 읽는 동안 I / O 에러가 발생했다.
- EBADF: fd 가 유효한 파일 디스크립터가 아니거나 읽기 위해 열리지 않았다.
- EINVAL: fd가 읽기에 적당하지 않는 객체와 연결되었다.
- EFAULT: buf가 접근할 수 없는 주소 공간을 가리키고 있다.
WRITE() 함수
기능 : 디바이스 파일에 데이터를 쓴다.
형태 : #include <unistd.h>
ssize_t write(int fd,const void *buf,size_t count);
설명 : fd에 해당하는 디바이스 파일에 buf가 가리키는 주소에 있는 데이터를 count 만큼 쓴다.
이때 count 값은 SSIZE_MAX 보다 작아야 한다. 이 함수는 open()함수에서 O_NONBLOCK,
O_NDELAY가 지정되지 않는 경우에는 count 값의 크기만큼 데이터를 쓸 때까지 블록된다.
디바이스 파일의 디바이스 드라이버를 O_NONBLOCK,O_NDELAY에 대해 구현하지 않을 경
우에는 해당 옵션을 지정하더라도 블록되지 않을 수 있다. 원틱적으로 이런 경우는 잘못된
디바이스 드라이버이다. 프로그램을 작성할 때는 이런 경우에도 대비해야 하기 때문에 반환
되는 결과값을 확인 해야 한다. 이 함수의 실행 결과로 파일 포인터의 위치른 데이터를 넣은
만큼 이동된다.
매개변수 : *fd : open() 함수 실행 결과로 반환된 파일 디스크립터
*buf : 쓸 데이터를 저장한 공간의 주소. 이 주소가 가리키는 저장 공간의 크기는 count값 보다 커야 한다.
*count : 디바이스 파일에 쓸 데이터의 크기. 이 크기는 SSIZE_MAX보다 작게 지정해야 한다.
이값이 0 이면 즉시 실행이 종료된다.
반환값 : 디바이스 파일에 데이터를 정상적으로 썼다면 쓴 만큼의 바이트 수를 반환한다.
만일 이 수가 요구한 바이트의 수보다 작더라도 에러는 아니다. 이는 실제로 요구된 만큼
쓰지 못했을 경우나 어떤 신호에 의해 인터럽트 되었기 때문이다. 실패하면 -1을 반환한다
-1을 얻었을 떄는 전역 변수의 error값을 참조하면 실제 디바이스 드라이버에서 반환한
값을 확인 할 수있다.
*error 값
-EBADF : fd가 유효한 파일 디스크립터가 아니거나 쓸수 있게 열려있지 않다.
-EINVAL : fd가 쓰기에 적당하지 않은 객체와 연결되었다.
-EFAULT: buf는 접근할 수 없는 주소 공간을 가리키고 있다.
-EAGAIN: O_NONBLOCK으로 열렸지만 write호출 시에 즉시 처리 할수 있는 상황이 아니다.
-EINTR: 어떤 데이터를 모두 쓰기 전에 신호에 의해 함수가 인터업트 되었다.
-ENOSPC:fd로 참조되는 파일을 포함하는 디바이스에 데이터를 위한 공간이없다.
-EIO:디바이스 파일에서 데이터를 쓰는 동안 I/O에러가 발생했다.
lseek() 함수
기능 : 읽기 또는 쓰기의 위치를 변경한다.
형태 : #include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
설명 : lseek() 함수는 파일 디스크립터 fd에 해당하는 디바이스 파일에서 파일 포인터의 위치를
변경한다. whence가 지정하는 옵션값에 따라 해석되는 offset 값의 위치로 파일 포인터의
위치를 변경한다. 변경된 파일 포인터의 위치는 디바이스 파일에 연동된 디바이스 드라이버
가 어떻게 처리하는가에 따라 여러 가지로 해석 될수 있다. 예를 들어, 메모리를 관리하는
디바이스 드라이버라면 메모리의 주소로 이용될 수 있다. 그러나 대부분의 문자 디바이스
드라이버는 이 기능을 사용하지 않는다.
매개변수 : *fd : open() 함수 실행결과로 반환된 파일 디스크립터
*offset : 이동할 파일 포인터의 위치를 바이트 단위로 지정한다. 이 값은 음수 값이다.
이값은 whence에 따라 실제 이동 위치로 해석된다.
*whence : offset을 해석하기 위한 조건을 지정한다.
-SEEK_SET : 이동 위치는 offset이 가리키는 값을 그대로 적용한다.
-SEEK_CUR : 이동 위치는 현재 위치에 OFFSET값을 더한 위치가 적용된다.
-SEEK_END : 이동 위치는 마지막 위치에서 OFFSET을 뺀 위치로 정한다.
디바이스 파일은 대부분 끝에 대한 정의가 애매하기 때문에 이값을 잘
사용하지 않는다.
반환값 : 성공시 lseek는 파일 시작에서 바이트로 측정된 결과 변위 위치를 반환한다. 그렇지 않으
면 (off_t)-1의 결과가 반환되며, errno는 에러를 가리키도록 설정된다. 파일 포인터 위치가
정상적으로 이동 되었다면 이동한 실제 위치를 반환한다. 실패하면 -1을 반환한다. -1을
얻었을대 전역 변수인 errno값을 참조하면 실제 디바이스 드라이버에서 반환한 값을 확인
할 수 있다.
*errno값
-EINVAL : whence에 지정한 값이 적당하지 않다.
ioctl() 함수
기능 : 디바이스 파일을 제어한다.
형태 : #include <sys/ioctl.h>
int ioctl(int fd,int request,....);
설명 : ioctl()함수는 파일 디스크립터 fd에 해당하는 디바이스 파일에 read()와 write()함수로 처리 하기 힘든
입출력 처리에 하용한다. 이 함수와 관련된 각 매개변수 중에 fd를 제외하고는 값에 대한 표준이 없다.
몇 가지 매크로로 값의 정의에 대한 표준만 정해 놓고 있다. 실질적인 각 값의 의미는 각 디바이스 파일마다
다르게 해석되어 적용된다. ioctl()함수의 매개 변수의 수는 가변적으로 문법상 표현되기는 하나
최대 3개까지만 허용한다. 세번째 인자는 전통적으로 char *argp로 표현된다.
매개변수 : *fd:open()함수 실행 결과로 반환된 파일 디스크립터
*request: 디바이스 파일에 연동된 디바이스 드라이버에서 취해야 할 명령을 정의한다.
이 값은 매크로에 의해서 출력용 명령인지 입력용 명령인지 argp가 지정하는
값이 기억 곡ㅇ간의 주소일 경우 전달할 인자에 대하여 바이트 단위의 크기를
나타낸다.
*...: 세번째 매개변수는 argp로 지칭 되기도 하는데, 생략이 가능한 매개변수로
request에 따른다. request 명령을 처리하는 보조적인 정보 값이다.
반환값 : 실행이 성공적이면 0을 반환한다. 실채하면 -1을 반환한다. -1을 얻었을 때는 전역변수인
errno 값을 참조하면 실제 디바이스 드라이버에서 반환한 값을 확인할수 있다.
*errno값
-EFAULT:argp는 접근할 수 없는 메모리 영역을 가리킨다.
-ENOTTY:fd는 문자 디바이스 파일과 연관되어 있지 않다.
-EINVAL: 디바이스 파일에 연동된 디바이스 드라이버가 request또는 argp를 처리 할수 없다.
fsync() 함수
기능 : 디바이스 파일에서 하드웨어에 적용되지 않은 상태를 즉시 적용시켜 동기화한다.
형태 : #include <unistd.h>
int fsysnc(int fd);
설명 : fsync함수는 디바이스 파일에 쓴 데이터가 디바이스 드라이버의 실제 디바이스 드라이브에서 모두
처리되게 한다. 처리 되는 동안에 이 함수를 호출한 프로세스는 블록된다.
매개변수 : *fd:open() 함수 실행 결과로 반환된 파일 디스크립터
반환값 : 실행이 성공적이면 0을 반환한다. 실패하면 -1을 반환한다.-1을 억었을 떄는 전역변수인 errno값을
참조하면 실제 디바이스 드라이버에서 반환한 값을 확인할 수 있다.
*errno값
-EROFS,EINVAL:디바이스 파일이 이 함수에 대한 처리를 지원하지 않는다.
-EIO:동기화 하는 동안 에러가 발생했다.