리눅스는 모든 게 다 파일로 이루어져있다. 파일 시스템을 이해하는 것은 파일 입출력 작업을 수행하고 리눅스/유닉스 시스템을 이해하는 데 시작점이라고 할 수 있다.
리눅스에선 기본적으로 3가지의 파일이 열려있고 각 파일을 id로 구분한다. 다음 3 파일은 운영체제가 시작되면서 바로 오픈된다.
사용법
man 2 write
예시
// write.c
#include <unistd.h> // write()
#include <stdlib.h> // exit()
int main() {
if((write(1, "Here is some data\n", 18)) != 18) // stdout이 8글자가 아니면
write(2, "file descriptor에 쓰기 에러가 발생\n", 46) // stderr로 에러 메세지 출력
exit(0);
}
gcc -o write write.c
./write
사용법
#include <unistd.h>
size_t read(int fd, void *buf, size_t count);
예시
#include <unistd.h>
#include <stdlib.h>
int main() {
char buffer[128];
int nread;
nread = read(0, buffer, 128); // stdin으로 입력을 받아서 buffer에 128자까지 쓰고 size를 nread에 담음
if(nread == -1) {
write(2, "A read error has occurred\n", 26);
if(write(1, buffer, nread) != nread)
write(2, "A write error has occured\n", 27);
exit(0);
}
사용법
#include <fcntl.h>
#incldue <sys/types.h>
#include <sys/stat.h>
int open(const char *path, int oflags);
int open(const char *path, int oflags, mode_t mode);
Flag
Mode | Description |
---|---|
O_RDONLY | Open for Read-Only |
O_WRONLY | Open for Write-Only |
O_RDWR | Open for Reading and Writing |
Mode
사용법
#include <unistd.h>
int close(int fd);
int ioctl(int fd, int cmd, ...);
cp 명령어
// ex_cp.c
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
int main() {
char c;
int in, out;
// read only로 file.in을 열고
if((in = open("Resources/file.in", O_RDONLY)) < 0) {
perror("input");
exit(0);
}
// write only 또는 생성모드로 file.out을 열고
if((out = open("Resources/file.out", O_WRONLY|O_CREAT, 0777)) < 0) {
perror("input");
exit(0);
}
while(read(in, &c, 1) == 1) // 한글자 씩 읽는데 size가 1일 때까지
write(out, &c, 1); // out파일에 1글자 씩 쓰기
close(in);
close(out);
exit(0);
}