반응형

프로그래밍 기술/리눅스(Unix) 시스템 프로그래밍 31

[리눅스/유닉스 시스템 프로그래밍] dup, dup2

3.6 dup, dup2 리눅스 시스템에서는 열려진 파일의 디스크립터를 복제하는 dup와 dup2 함수를 제공합니다. // ex_dup.c #include "eh.h" int main(int argc,char **argv) { int fd1 = 0, fd2=0; char buf[10+1]=""; if(argc != 2) { fprintf(stderr,"usage: %s [file name]\n",argv[0]); return 1; } fd1= open(argv[1],O_RDONLY); if(fd1 == -1) { fprintf(stderr,"failed open %s\n",argv[1]); return 1; } fd2= dup(fd1); if(fd2 == -1) { perror("failed dup");..

[리눅스/유닉스 시스템 프로그래밍] 파일 테이블과 파일 디스크립터 테이블

3.5 파일 테이블과 파일 디스크립터 테이블 리눅스 시스템에서는 프로세스마다 파일 디스크립터 테이블을 갖고 있습니다. 그리고 파일 디스크립터 테이블에는 open에서 사용한 flags와 파일 테이블 요소의 위치 정보를 포함합니다. 그리고 커널은 모든 열려진 파일들을 관리하는 파일 테이블을 가지고 있습니다. 파일 테이블의 항목 엔트리에는 파일의 상태 flags와 현재 파일의 작업 offset과 파일의 vnode 테이블의 위치 정보를 포함합니다. 그리고 vnode 테이블의 각 항목은 inode 정보와 현재 파일의 크기를 포함합니다. 먼저 하나의 프로세스에서 같은 파일을 두 번 열었을 때를 살펴봅시다. 같은 파일을 두 번 열면 서로 다른 파일 디스크립터를 부여하고 서로 다른 파일 오프셋을 유지합니다. 따라서 프..

[리눅스/유닉스 시스템 프로그래밍] lseek

3.4 lseek 파일 입출력 작업을 할 때 lseek 함수를 이용하여 원하는 위치로 이동할 수 있습니다. 현재 작업하고 있는 파일의 시작 위치에서 상대적 거리를 파일 offset이라 부르며 lseek 함수를 이용하면 파일의 시작 위치나 현재 위치, 파일의 끝에서 상대적 거리로 이동할 수 있습니다. 하지만 FIFO나 pipe처럼 특수한 파일은 lseek를 허용하지 않습니다. //ex_ enable_lseek.c #include #include #include #include int main(int argc,char **argv) { int fd = 0; if(argc != 2) { fprintf(stderr,"usage: %s [filename]\n",argv[0]); return 1; } fd = op..

[리눅스/유닉스 시스템 프로그래밍] read, write

3.3 read, write 파일을 열고 난 후에 데이터를 쓰거나 읽어올 때는 read와 write 함수를 사용합니다. // ex_read_write.c #include #include #include #include #define MAX_TIT_LEN 100 #define MAX_AUT_LEN 20 #define DUMMY_FNAME "dummy" typedef struct _Book Book; struct _Book { char title[MAX_TIT_LEN+1]; char author[MAX_AUT_LEN+1]; int num; }; void TestWrite(); void TestRead(); int main() { TestWrite(); TestRead(); return 0; } void Te..

[리눅스/유닉스 시스템 프로그래밍] open, close

3.2 open, close 파일 입출력 작업을 위해 파일을 열 때 open 함수를 이용하고 작업을 마치고 파일을 닫을 때 close 함수를 이용합니다. //ex_open1.c #include #include #include #include #include int main(int argc,char **argv) { int fd = 0; if(argc != 2) { printf("Usage %s [filename]\n",argv[0]); exit(0); } fd = open(argv[1],O_WRONLY); if(fd

[리눅스/유닉스] 파일 입출력

3. 파일 입출력(File Input/Output) 이번 장에서는 리눅스 시스템에서 제공하는 파일 입출력 시스템 호출에 관한 함수들을 소개합니다. 파일 I/O에 관한 리눅스 시스템 호출로 파일을 열어 데이터를 쓰거나 파일의 내용을 읽어오는 등의 작업을 할 수 있습니다. 대표적인 파일 I/O에 사용하는 시스템 호출에는 open, close, read, write, lseek 함수가 있습니다. 3.1 파일 기술자(File Descriptors) 리눅스 시스템에서는 프로세스가 파일 입출력을 위해 열려진 파일마다 파일 기술자를 참조합니다. 프로세스가 open 함수를 호출하면 리눅스 시스템의 커널에서는 기존의 파일을 열거나 새로운 파일을 생성하여 파일 기술자를 반환합니다. 파일 기술자는 부호가 없는 정수로 하나의..

[리눅스/유닉스 시스템 프로그래밍] 파일 시스템

2. 파일 시스템(File System) 이번 장에서는 파일 시스템을 알아봅시다. 파일 시스템을 이해하는 것은 보다 효과적으로 파일 입출력 작업을 수행할 수 있게 해 줄 것입니다. 그리고 리눅스(유닉스) 시스템을 이해하는 시작점이라 할 수 있습니다. 유닉스 파일 시스템은 4개의 주요 블록으로 구성하고 있습니다. 운영체제를 부팅하기 위해 필요한 부트 블록과 파일 시스템의 크기를 비롯하여 주요 정보를 나타내는 슈퍼블록, 실질적인 파일 정보와 매핑하는 i-node 블록, 마지막으로 실제 데이터를 저장하는 데이터 블록입니다. 이 외에도 파일 시스템에 따라 통계 정보 등을 관리하는 블록이 있습니다. [그림 2.1] 유닉스 파일 시스템의 구조 유닉스 시스템은 파티션마다 독립적인 파일 시스템을 갖습니다. 그리고 최소..

[리눅스/유닉스 시스템 프로그래밍] GCC 컴파일러 사용법

1.2 GCC 컴파일러 사용법 이 책에서는 작성한 코드를 GCC 컴파일러를 통해 컴파일하고 테스트하는 부분이 많습니다. 이를 위해 GCC 컴파일러를 사용하는 방법을 소개할게요. 먼저 명령행에서 gcc 메뉴얼을 확인하세요.$ man gccGCC(1) GNUNAME gcc - GNU project C and C++ compilerSYNOPSIS gcc [-c|-S|-E] [-std=standard] [-g] [-pg] [-Olevel] [-Wwarn...][-pendantic] [-Idir...][-Ldir...] [-Dmacro[=def]...][-Umacro] [-foption...][-mmachine-option...] [-o output] [@file] infile...... 옵션을 사용하지 않고 g..

[리눅스/유닉스 시스템 프로그래밍] 리눅스

1.1 리눅스 리눅스는 핀란드 대학생이었던 리누즈 토발즈가 1991년 개발한 운영체제입니다. 이후 리눅스는 GNU 프로젝트로 유지 보수 및 발전하였고 GCN/Linux로도 부릅니다. 특히 레드햇, 페도라, 우분투 등의 배포판들이 생기면서 시스템 프로그래머를 꿈꾸는 이들 뿐만 아니라 일반 사용자들까지 대중적으로 사용하고 있습니다. 최근에는 IBM이나 구글, 선, 오라클 등의 많은 IT 업체들의 지원을 받아 비약적으로 발전하고 있습니다. 리눅스는 유닉스 운영체제를 연구하기 위한 목적으로 만들었습니다. 이러한 이유로 리눅스의 커널은 유닉스의 복사본이라고도 부릅니다. 리눅스를 GNU 프로젝트로 포함하면서 아파치, MySQL, PHP를 넘어서는 GNU의 대표 프로젝트로 자리잡았습니다. 리눅스 운영체제는 명령행 인..

반응형