레이블이 임베디드 시스템인 게시물을 표시합니다. 모든 게시물 표시
레이블이 임베디드 시스템인 게시물을 표시합니다. 모든 게시물 표시

2016년 5월 6일 금요일

리눅스의 파일처리 - write()

리눅스의 파일의 내용을 저장하기 위해 read()함수를 사용해 cat명령과 동일한 결과를 만들어냈다. 이 뿐만 아니라 파일의 내용에 저장할 수 있는 기능인 write()를 소개하겠다.

write함수는 read함수와 다르게 파일의 내용에 새로운 데이터를 저장할 수 있으며, 수정, 덧붙이기 등 필요한 작업을 수행할 시 사용된다.

write()의 사용법
: write(파일 디스크립터, 추가할 데이터, 추가할 데이터의 크기);

ex_1) "hello world" 출력 (write함수 사용)
        ( test.txt파일에 hello라는 내용이 저장되어 있음 )



▶실행결과








ex_2) 파일 두개를 결합하여 새로운 파일생성하기
( hello.txt : hello라는 내용  /   world.txt : world라는 내용이 저장되어 있음 )





▶실행결과

리눅스의 파일처리 - read()

이전에 리눅스에서는 모든장치(H/W, 외부장치 포함)는 파일로써 관리되며, 장치에 접근하기 위해서는 파일디스크립터(FD)를 사용한다고 언급했었다.

이제 파일에 접근하여 수행하는 작업들 중에서 read()에 대해서 살펴보자.

read()는 말 그대로 '파일을 읽어오는 형태 구나'라고 생각하면된다.

read()의 역할은 open한 파일을 읽어온다, 즉 파일의 내용을 불러온다.
(파일디스크립터을 통해 파일에 접근한 뒤 파일의 내용을 저장할 수 있는 기능)

ex) read 함수 사용법
: read(파일 디스크립터, 파일의 내용을 저장할 공간, 불러올 파일의 내용크기);


ex) read함수를 사용해 cat명령어 수행하기.




리눅스의 파일처리 - open()

리눅스에서는 디렉터리뿐만 아니라 하드웨어적인 모든 장치들을 파일로 취급한다.
( 일반 파일뿐만아니라, 외부장치도 파일로 취급함. )

그래서 어떤 특정한 장치(H/W)에 접근하기 위해서 파일디스크립터(FD)를 사용하면된다.

파일디스크립터(FD)는 특정한 파일에 접근하기위해 추상화시켜놓은 장치이다. 
간다히 말해서 '장치에 접근하기위한 핸들러 같은 역할을 하는구나' 생각하면된다.
이러한 핸들러, 파일디스크립터를 사용하는 방법은 먼저 파일을 연 상태에서 데이터의 추가, 삭제 등 원하는 작업을 하며, 필요한 역할을 끝냈으면 연 파일을 닫아주는 작업또한 필요하다. 이러한 작업을 다음과같은 함수를 이용하면된다.

1. Open()
핸들러 역할을하는 파일디스크립터의 의미를 부여할 수 있는 open()이다.
ex) open("파일명", 옵션);
: 파일명 : 원하는 파일을 입력
: 옵션    : 파일을 읽기, 수정, 생성 등 어떠한 작업을 할것인지 옵션부여

필요한 작업에서 다양한 옵션을 선택하는데, 그 중에서 대표적으로 사용하는 4가지 옵션
- O_RDONLY  :  읽기전용으로 파일열기
- O_RDWR     :  읽기/쓰기 전용으로 파일열기
- O_CREAT     :  파일의 생성
- O_APPND    :  파일에 추가

리눅스의 파이프명령( | )으로 이옵션들을 함께 사용할수있다.
ex) 파일을 읽기/쓰기 전용으로 열기, 파일이 존재하지않으면 생성.
     fd = open("test.txt", O_RDWR | O_CREAT)   
     // fd는 핸들러 역할을 하며, test.txt의 파일 크기가 저장됨.
그리고 필요한 작업을 마쳤다면, 파일을 연상태이니 close()함수를 통해서 닫으면된다.
ex) close(fd);

ex) Open함수 사용




2016년 4월 6일 수요일

프로세스(Processs)와 스레드(Thread)






 스레드란?
 먼저, 스레드는 컴퓨터 프로그램 실행시 프로세스 내부에 존재하는 수행경로이다.
하나의 프로세스에서 둘 이상의 흐름을 만들때 사용이되며, 프로세스 생성시 하나의 
주 스레드가 실행이되어 대부분의 작업을 처리하고 주 스레드가 종료되면 프로세스도 종료
된다.


* 멀티태스킹 : 하나의 운영체계에서 둘 이상의 프로세스가 동시에 실행되는 환경.
* 멀티스레딩 : 하나의 프로세스에서 다수의 스레드가 동시에 수행되는 것.


2016년 3월 22일 화요일

컴파일 과정


오늘은 임베디드 시스템에서 기본적으로 알아야할 내용들 중에
컴파일과정들을 살펴보도록 하겠다.

c언어는 고급언어로 프로그래머가 작성하기는 쉬우나 CPU가 그대로 이해할 수는 없다.
어느정도의 과정을 거쳐서 CPU가 이해할 수 있는 기계어로 번역이 된어야한다.

먼저, 우리는 test.c라는 c언어로 작성한 소스코드의 내용들을 작성하였다고 가정해보자!


                                                     <컴파일 과정>

위 그림의 흐름을 이해하기위해 세부적인 내용을 알아보겠다.

-전처리기
 입력한 소스코드를 전처리기를 통해서 test.i 파일이 생성된다. "이제 컴파일이 실행하는 단계구나 !" 라고 생각하자면 된다.
(헤더파일을 보면 '#'이라고 되어있는 것들을 전처리기 구문이라고 하는데, 이러한 것들을 실행하기위해선 라이브러리들을 저장해야 함)

-컴파일러
 test.i를 컴퓨터가 읽을 수 있는 기계어로 변환하기 위한 번역기이다.  고급언어는 사람을 위해 만들어진 것이며, 0과 1밖에 모르는 컴퓨터는 스스로 해석하는것이 불가능하므로 이 과정이 없어서는 안된다.
기계어로 변환하기 전 c언어보다 하층에 있는 어셈블리어로 변환하고 이 어셈블리어 다음 기계어로의 변환이 이루어진다.    (ex. 고급언어 → 어셈블리어 → 기계어 )

-어셈블러
 test.s를 이제 완전히 기계어로 바꾸어주는 번역기이다. 이 과정이 지나면 목적파일이라는 .obj가 생성이 된다.

-소스파일을 번역하여 곧바로 실행파일로 만들어지않고 목적파일이라는 중간과정을 거치는 이유?
 여러개의 소스를 합쳐 하나의 실행파일을 만들어낼 수 있어야 하기 때문이다.
하나의 소스에 필요한 모든 명령을 다 기술할 수 없으므로 소스를 여러개 작성하고
이것을 모두 연결하면 완전한 실행파일이 나오게 된다.

-링커
 test.obj 파일을 다른 목적파일 + 이미 만들어진 라이브러리들을 결합시킨다. 이 단계를
거치면 실행파일(.exe)이 완성된다.
( 소스를 여러개 작성해서 최종적으로 링크하는 방식을 분할 컴파일이라고 하는데, 여러
 사람이 같이 작업하거나 기능별 모듈을 개발할 때 일반적으로 사용하는 방법이다. )

-마무리
 마지막으로 이 실행파일을 실행하면 운영체제의 로더(Loder)가
로드(Load)(메모리에 프로그램을 적재)하게되며 프로그램이 메모리에 로드된 상태를
우리는 "프로세스(Process)가 발생했다"라고 한다.


-왜 프로그램은 실행하기위해 메모리에 적재되어야하는가?
 우리가 코드를 작성하고 변환작업을 거침 파일들이 저장되는 곳은 흔히말하는 스토리지(ex, HDD, SDD 등)이다. CPU와 스토리지가 직접 데이터를 주고받기에는 너무 느리기 때문에 CPU가 처리하기 위한 모든 프로그램은 최소 메모리(ex. RAM)에 적재되어야 한다. (최소라고 말하는 이유 : 메뫼 종류에는 순차적으로 여러 개가 존재하기 때문이다.) 흔히 우리가 사용하는 RAM은 휘발성이기 때문에 평소에는 스토리지에 저장해 두었다가 필요한 부분만 메모리에 적재시켜서 사용하게 된다.

[Java] N-I/O(Non-Blocking) 파일 읽기 쓰기 - GatheringByteChannel, ScatteringByteChannel, ByteBuffer 사용.

우리는 지금까지 다음과 같이 살펴보았다. 1.  InputStream / OutputStream : 입, 출력 스트림을 바이트로 처리하여 읽기, 쓰기. 2.  FileInputStream / FileOutputStream : 입, 출력 스트림을 ...