file1.c 생성
$ vi file1.c
open( " 경로 " , flag , permission mode )
#include <stdio.h>
int main(void){
int fd;
fd = open("./test", 0);
printf("fd = %d\n", fd);
return 0;
}
실행 결과
1.
root@ubuntu:/work/system# vi file1.c
root@ubuntu:/work/system# gcc -o file file1.c
root@ubuntu:/work/system# ./file
fd = -1 // 파일 오픈 실패
root@ubuntu:/work/system# touch test
root@ubuntu:/work/system# ./file
fd = 3 // fd는 3번.
flag 정보
flags |
의미 |
1 O_RDONLY |
읽기 전용으로 연다. |
2 O_WRONLY |
쓰기 전용으로 연다. |
3 O_RDWR |
읽기와 쓰기용으로 연다. |
4 O_CREAT |
해당 파일이 없으면 파일을 생성한다. |
5 O_EXCL |
해당 파일이 존재하면 실패하고 파일을 열지 않는다. (두 프로그램이 동시에 파일 생성하는 것 방지) |
6 O_TRUNC |
해당 파일이 존재하면 파일의 길이를 0으로 만든다. 즉, 파일의 내용을 모두 지운다. |
7 O_APPEND |
쓰기 동작 시 파일의 끝에 추가된다. |
8 O_NOCTTY |
디바이스 파일인 터미널일 경우 터미널을 프로그램의 제어 터미널로 할당하지 않는다. |
9 O_NONBLOCK |
FIFO, 블록 특수 파일, 문자 특수 파일 등에서 입출력을 할 경우 읽거나 쓸 내용이 없더라도 장치가 준비 또는 사용 가능하게 되는 것을 기다리지 않고 바로 -1을 반환한다. |
0 O_SYNC |
쓰기 동작시 물리적인 쓰기 동작이 완료될 때까지 기다린다. |
/usr/include/asm-generic/fcntl.h 에 플래그 설정이 되어있다.
#include <stdio.h>
#include <fcntl.h>
int main(void){
int fd;
fd = open("./test", O_RDONLY );
printf("fd = %d\n", fd);
return 0;
}
root@ubuntu:/work/system# gcc -o file file1.c
root@ubuntu:/work/system# ./file
fd = 3 // 파일이 있음
root@ubuntu:/work/system# vi file1.c
root@ubuntu:/work/system# gcc -o file file1.c
root@ubuntu:/work/system# ./file
File Error // 파일이 없음
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
int main(void){
int fd;
fd = open("./test", O_RDONLY);
if (fd < 0) {
printf("File Error \n");
printf("Error Number = %d\n", errno); // out errno
exit(1);
}
printf("fd = %d\n", fd);
return 0;
}
/usr/include/asm-generic/errno-base.h
#define ENOENT 2 /* No such file or directory */
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
int main(void){
int fd;
fd = open("./test", O_RDONLY);
if (fd < 0) {
printf("File Error \n"); // 걍 프린트
printf("Error Number = %d\n", errno); // 커널이 판단하는 에러의 번호 출력
printf("%s\n", strerror(errno)); // 커널이 판단하는 에러의 문자열 출력
exit(1);
}
printf("fd = %d\n", fd);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
int main(void){
int fd;
fd = open("./test", O_RDONLY); // 읽기 전용으로 열기
if (fd < 0) {
printf("File Error \n");
printf("Error Number = %d\n", errno); // printing errno
printf("%s\n", strerror(errno));
perror("open");
exit(1);
}
printf("fd = %d\n", fd);
return 0;
}
root@ubuntu:/work/system# touch test
root@ubuntu:/work/system# ./file
fd = 3
#include <stdio.h>
root@ubuntu:/work/system# gcc -o file file1.c
root@ubuntu:/work/system# ./file
File Error
Error Number = 17
File exists
open: File exists
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
int main(void) {
int fd;
int nr;
char buffer[100];
fd = open("./kmu", O_RDONLY);
if ( fd < 0 ){
perror("open");
exit(1);
}
nr = read(fd, buffer, 5);
printf("reading : %s\n", buffer);
printf("%d bytes reading\n", nr);
close(fd);
return 0;
}
root@ubuntu:/work/system# ./file2
reading : kmu
ʂ8)w�
4 bytes reading
#include <unistd.h>
int main(void) {
int fd;
int nr;
int fd2;
int nw;
char buffer[100];
char buffer2[100] = "university\n";
fd = open("./kmu", O_RDONLY);
fd2 = open("./univ", O_RDWR | O_CREAT | O_APPEND, 0644);
if ( fd < 0 ){
perror("open");
exit(1);
}
fd2 = open("./univ", O_RDWR | O_CREAT | O_APPEND, 0644);
nr = read(fd, buffer, 5);
printf("reading : %s\n", buffer);
printf("%d bytes reading\n", nr);
nw = write(fd2, buffer2, 11);
printf("%d bytes reading \n" , nr);
close(fd);
close(fd2);
return 0;
}
root@ubuntu:/work/system# gcc -o file2 file2.c
root@ubuntu:/work/system# ./file2
reading : kmu
4 bytes reading
11 bytes reading
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
int main(void) {
int fd;
int nr;
int fd2;
int nw;
char buffer[100];
fd = open("./kmu", O_RDONLY);
if ( fd < 0 ){
perror("open");
exit(1);
}
fd2 = open("./univ", O_RDWR | O_CREAT | O_APPEND, 0644);
while(1) {
nr = read(fd, buffer, 5);
if ( nr == 0) break;
printf("reading : %s\n", buffer);
printf("%d bytes reading\n", nr);
nw = write(fd2, buffer, nr);
printf("%d bytes reading \n" , nw);
}
close(fd);
close(fd2);
return 0;
}
root@ubuntu:/work/system# ./file
reading : korea�8I~�
5 bytes reading
5 bytes reading
reading :
kmu
�8I~�
5 bytes reading
5 bytes reading
reading : unive�8I~�
5 bytes reading
5 bytes reading
reading : rsity�8I~�
5 bytes reading
5 bytes reading
reading :
embe�8I~�
5 bytes reading
5 bytes reading
reading : dded
�8I~�
5 bytes reading
5 bytes reading
root@ubuntu:/work/system# cat univ
korea
kmu
university
embedded
'이전것 > 개발' 카테고리의 다른 글
module (2) (0) | 2016.05.09 |
---|---|
module (0) | 2016.05.02 |
다항식 덧셈 프로그램 이중 연결리스트 (0) | 2015.05.11 |
Wireshark_Intro_6.0 (0) | 2015.03.24 |
AvlNode (0) | 2014.12.04 |