Linux/System Programming

    [파일입출력] 5. lseek()으로 파일 탐색하기

    [파일입출력] 5. lseek()으로 파일 탐색하기

    파일을 열어 이젠 원하는 위치로 자연스럽게 파일의 위치(?), 커서(?)를 lseek() 시스템 콜을 이용하여 이동해보겠습니다. 시스템 프로그래밍을 하다보면 어떤 경우 파일의 내가 원하는 위치로 커서를 이동시키고 싶은 경우가 있습니다. 그럴 때 자주 사용되는데요, lseek()이란 시스템 콜을 이용하면 된답니다. #include #include off_t lseek (int fd, off_t pos, int origin) 입력 인자 int fdopen() 시스템 콜로 열린 파일을 가리키는 파일 지정 번호 off_t pos 파일에 이동할 위치 지정 originlseek() 시스템 콜에 인자(아래 표 참고) 반환값 off_t파일 쓰기 성공 : 파일의 새로운 오프셋 파일 쓰기 실패 : -1 위의 내용을 보면 ..

    [파일입출력] 4. 동기식 입출력

    입출력을 동기화하는 것은 분명 중요합니다. 하지만, 그 문제를 너무 확대 해석하고 크게 신경 쓸 필요는 없습니다. 요즘의 운영체제들은 버퍼를 통한 지연된 쓰기 작업을 구현하고 있습니다. 그렇기에 앞에 write() 시스템 콜 이용 시 주의해야 될 사항들을 그렇게 신경쓰지 않으셔도 됩니다. 하지만, 개발을 하다보면 개발자가 직접 데이터가 디스크에 기록되는 시점을 제어하고 싶을 때가 있습니다. 이런 상황에 맞춘 몇몇의 시스템 콜을 확인해 보겠습니다. 1. fsync() 시스템 콜과 fdatasync() 시스템 콜 첫 번째는 fsync() 시스템 콜과 fdatasync() 시스템 콜입니다. 먼저, fsync() 시스템 콜에 대해 알아보겠습니다. #include int fsync (int fd) 입력인자 int..

    [파일입출력] 3. write()로 파일에 쓰기

    [파일입출력] 3. write()로 파일에 쓰기

    지난번에 read() 리눅스 시스템 콜을 이용하여 파일에 데이터를 써보았다면, 이번에는 리눅스 시스템 콜 중 write()를 이용하여 파일에 데이터를 써보도록 하겠습니다. write()는 보자마자 아시듯이 read()의 반대 개념입니다. read()와 동일하게 파일디스크립터를 이용하여 참조한 파일에 데이터를 씁니다. 먼저, write() 시스템 콜의 원형과 인자를 확인해 봅시다. #include ssize_t write (int fd, void *buf, size_t len) 입력 인자 int fd open() 시스템 콜로 열린 파일을 가리키는 파일 지정 번호 void* buf 파일에 쓸 데이터를 저장하고 있는 메모리 공간 len 파일에 쓸 데이터의 길이 반환값 ssize_t 파일 쓰기 성공 : writ..

    [파일입출력] 2. read()로 파일 읽기

    [파일입출력] 2. read()로 파일 읽기

    지난 번 파일을 열었다면, 이번엔 열려있는 파일을 읽어보겠습니다. 가장 대표적인 저수준 파일 입출력에서는 POSIX에 정의된 read() 시스템 콜을 사용하여 파일을 읽어 들이는데요, 파일 오픈 시 사용했던 파일 디스크립터 기억나시나요? fd가 참조하는 파일의 오프셋에서 len 바이트만큼 buf로 읽어 들이게 됩니다. 먼저, read() 시스템 콜의 원형과 인자를 확인해 봅시다. #include ssize_t read (int fd, void *buf, size_t len) 입력 인자 int fd open() 시스템 콜로 열린 파일을 가리키는 파일 지정 번호 void* buf 파일에서 읽은 데이터를 저장할 메모리 공간 len 읽을 데이터의 크기(Byte 단위) 반환값 ssize_t 파일 읽기 성공 : 0..

    [파일입출력] 1. 파일열기

    [파일입출력] 1. 파일열기

    리눅스는 거의 모든 것을 파일로 표현하고, 파일로 다룬다.그렇기에 리눅스 시스템 프로그래밍에서 파일 입출력은 굉장히 중요한 부분이다. 파일을 다루는 가장 기본적인 리눅스 시스템 콜을 하나씩 알아볼 것이다. 파일을 조작(읽거나 쓰는) 하기 전에 반드시 열어야 한다. 리눅스 커널은 파일 테이블이라고 하는 프로세스 별로 열린 파일들을 관리한다.이때 이 파일들은 파일 디스크립터로 인덱싱되어 관리된다. 파일 디스크립터는 종종 fd 라고도 많이 불리는데, 이 테이블에는 다양한 파일의 정보가 담겨있다.이 파일 디스크립터는 사용자 영역과 커널 영역 모두에서 프로세스 내의 고유한 식별자로 사용된다. 먼저 파일을 열기 위한 방법에 대해 알아보자. 파일에 접근하는 가장 기본적인 방법은 read(), write()등의 시스템..

    fork

    fork

    fork를 이용하여 프로세스를 생성하면 프로세스 생성 전까지의 프로세스 상태도 자식 프로세스로 모두 전달된다. 전달되는 상태는 프로그램 코드, 변수 값, 레지스터 설정 값 등 복사되어 전달되고, 부모와 자식은 fork가 수행된 후 부터 나머지 코드를 수행하게 된다. 따라서 위에서 반복문을 이용하여 i란 변수 하나를 부모와 자식 프로세스에서 변수값을 변경하게 된다. 결과를 보면 부모와 자식은 전혀 어떠한 관계도 없이 따로 변수 값이 변함을 알 수 있다. 즉 fork에 의해 생성된 자식 프로세스는 부모를 그대로 복사하여 새로 생성된 pid만 다른 프로세스라고 생각 하면 된다.