728x90
반응형
*FAT
우리가 변수를 선언하고 값을 대입하면 그 변수에 대해서 symbol table을 만든다
마찬가지로 우리가 파일을 만들면 하드디스크의 위치등을 포함하는 같은 심볼테이블을 만든다
그와 같은 심볼테이블중 가장 간단한 형태중 하나가 FAT(file allocation table)이다
다음과 같은 형태와 비슷하게 저장되어 있을 것이다
type 이름 위치
exe main 섹터의 어느부분
... ... ....
위와는 다르게 접근 권한을 설정해주는 등의 방식으로 파일저장 테이블을 만드는 방식(NTFS :원도우방식)등도
있다
embedded에서는 거의FAT방식을 사용한다
우리가 구조체 20바이트짜리를 선언하고 그것을 하드디스크파일에 저장한다고 하면 그 구조체는 다음과 같이 저장된다
[header][ 구조체 20바이트의 내용 ][tail]
위에서 header와 tail은 데이터를 안전하게 저장하기 위해서 데이터를 감싸는 역할을 한다고 볼 수있다
위에서 tail 부분은 생략될 수 있으나 header부분은 데이터에 대한 여러가지 정보를 가지고 있으므로 생략할 수 없다
그 정보 (파일의 크기 ,파일의 이름등)는 구조체 중간에 위치할 수도 있으나 대부분 앞 부분header에 위치한다
우리가 데이터 통신을 할때 사용하는 packet도 위와 같은 형식을 띄며 컴퓨터 상에서 다운받은 packet들을 모아서 header와 tail을 떼고 데이터를 다시 조합한다
또 우리가 mp3데이터를 열때 mp3파일의 헤더부분은 가수의 이름과 곡의 길이 등의 정보가 담기게 된다
우리가 bitmap파일을 열면 제일 첫 글자가 대문자 BM으로 시작됨을 알 수 있다
우리가 알씨 프로그램으로 bmp파일을 열면 그 첫글자를 보고 bmp파일임을 알고 그 형식대로 열어 보여주는 것이다
*고수준 파일입출력과 저수준 파일입출력
우리가 운영체제에 파일입출력을 요청하면 운영체제는 그 명령어(fopen ,fclose)를 사용하며 데이터 입출력을 즉시
실행하지 않고 버퍼에 데이터를 모아서 한번에 실행한다 이와 같은 파일입출력 방식을 고수준 파일입출력방식이라 한다
또 고수준 파일입출력함수는 파일포인터를 사용한다
그 의미는 파일 입출력을 하기 전에 FILE 구조체의 포인터를 하나 선언하고 입출력 함수에게 포인터를 넘겨준다. 파일이 fopen함수를 사용하여 I/O로 오픈 되면, 오픈된 파일은 파일에 기존 정보를 포함하는 FILE형태의 구조체와 연결된다. FILE 구조체에 대한 포인터는 파일이 오픈 되면 리턴 되고, 연속되는 동작은 파일과 관련된 이 포인터를 사용한다
우리가 printf함수를 사용할때 개행문자를 적지않으면 출력되지 않는다 그 이유는 printf함수가 내부적으로 버퍼를 사용하면서 아직 버퍼를 비울시기 즉 출력할 시기가 되지 않았다고 생각하고 표준출력장치 즉 모니터로 출력을 보내지 않기 때문이다 위와 같은 사정을 보았을때 우리는 printf함수가 내부적으로 고수준 파일입출력함수를 부름을 알 수 있다
다음의 예는 우리가 fopen함수와 fclose함수를 사용하여서 파일을 열고 닫으며 문자입출력함수를 사용하여서 문자
를 읽고 쓰는 코드이다
그 결과는 다음과 같다
위에서 보면 키보드로 문자열을 입력받아서 ($ 가 쓰일때까지 )
d11-1.dat라는 파일에 저장한 후 모니터로 받은 문자열을 출력하고 있다
고수준 파일입출력함수와는 대조적으로 우리가 저수준 파일입출력함수(open, close)를 사용하면 출력이나 입력이 즉시 실행된다
저수준 파일입출력함수는 버퍼를 사용하지 않으며 파일 포인터 대신 핸들을 사용한다 핸들은파일포인트와 다르게 정수형이며 open함수에 의하여 반환된다
저수준 입출력함수는 다음과 같은 형식을 사용한다
int open( char* filename ,int oflag,int pmode);
int close( int fd);
위에서 먼저 open함수의 인자들을 살펴보자
첫번째 인자 filename은 우리가 보통 정하는 파일의 이름이다 그 다음 oflag는 파일을 어떤 형식으로 열 것인지를 결정하는 결정값이다
그 값들을 살펴보면 다음과 같다
O_APPEND 0X0001 쓰기용으로 파일을 열어서 파일의 끝을 현재위치로 설정
O_CREAT 0X0002 쓰기용으로 파일을 생성한다 파일이 이미 존재하면 효과가 없다
O_EXCEL 0X0004 O_CREAT와 함께 사용되어 파일이 이미 존재할 경우 오류값 반환
O_RDONLY 0X0100 읽기 전용으로 파일을 연다
O_RDWR 0X0200 읽고 쓰기용으로 파일을 연다
O_TRUNK 0X0400 파일을 열고 내용을 삭제하고 파일의 길이를 0으로 만든다
O_WRONGLY 0X0800 쓰기전용으로 파일을 연다
O_BINARY 0X4000 이진모드로 파일을 연다
O_TEXT 0X8000 텍스트모드로 파일을 연다
위의 값들은 다음과 같이define되어 있음을 알 수있다
#define O_APPEND 0X0001
또 위의 값들은 상호배타적 이므로 다음과 같이 비트OR연산자를 사용해서 다음과 같이 사용가능하다
O_RDONLY | O_BINARY : 읽기 전용의 2진 모드 (0X4100)
그러나 읽기 전용과 쓰기전용은 동시에 되지 않음을 알 수있다
마지막 pmode값은 보통 생략되며 새로운 파일을 만들기 위해서 O_CREAT을 사용했을때 새로운 파일에 대한 접근 허가를 명시하기 위해서 사용된다
반환값은 위에서 얘기한 것처럼 양의 정수값이다 만약 오류가 발생하면 -1을 반환하게 되어있다
표준 입출력함수의 파일핸들값은 다음과 같다
stdin 0 , stdout 1, stderr 2.
우리는 open함수를 사용하여 핸들값을 반환받아서 사용하게 되면 표준입출력장치의 파일핸들값 이후의 값을 사용하여 파일을 열고 닫게 된다
위에서 말한 바이너리함수와 텍스트함수의 차이점을 보자
만약 우리가 255라는 숫자를 바이너리 형식으로 저장하게 되면 0X255라는 숫자로 저장되게 된다
반면에 255를 텍스트형식으로 저장하게 되면 '2' '5' '5'라는 각각의 아스키문자로 저장되게 될 것이다
다음 저수준 입출력함수의 사용법을 예를 들어서 살펴보자
int write( int fd, char *buffer ,int size);
위의 write함수는 파일핸들 fd가 가리키는 위치에 buffer문자열이 가리키는 문자를 size만큼 출력한다
다음 코드를 보자
그 결과를 보면
write 함수를 이용해서 표준 입출력장치인 모니터(1)로 we\n라는 문자열을 출력하고 있다 (개행문자 포함 3자)
*main함수의 인자
우리가 linux에서 gcc 를 실행하고 인자를 주지 않으면 다음과 같은 메시지가 나온다
즉 우리가 gcc프로그램내의 함수에 인자를 부족하게 전달했다는 의미이다
gcc실행파일내에서 전달되는 인자의 수를 세서 그 숫자가 기본적으로 전달되어야 하는 인자수보다 부족하면
위와 같은 메시지가 뜸을 알 수 있다
마찬가지로 main함수의 인자를 사용하여 실행하는 프로그램을 만들수 있다
다음 코드는 main함수에 인자를 전했을 때 그 인자수를 반환하는 프로그램이다
그 실행 결과는
위에서 실행함수명인 main3과 그 뒤의 인수 3개를 합쳐서 iNum값으로 4를 반환하고 있다
위에서 main함수인자의 각각의 의미를 살펴보자
먼저 첫번째 인자는 위에서 봤듯이 함수명과 그인자로 전달된 문자열의 총 수를 가리킨다
다음 두번째 인자 포인터배열은 각각의 문자열의 시작주소를 가리키는 포인터의 배열이다
즉 처음 String[0]은 main3 , 그 다음string[1]은 rrr등이다
다음 코드는 인자로 받아들인 문자열을 출력하는 프로그램이다
그 실행결과는 다음과 같음을 알 수있다
인자로 전달한 문자열수와 그 문자열을 차례대로 출력하고 있다
*운영체제에 종속적이지 않은 언어 java
자바는 가상머신이라는 것을 사용해서 어떤 플랫폼에서든 쉽게 이식이 가능한 프로그램을 만들수 있다
즉 운영체제를 신경쓰지 않고 프로그램을 작성할 수 있다
반면에 각각의 플랫폼에 맞는 가상머신을 만드는 사람들은 여러가지 고려할 사항들이 늘어날 것이다
우리가 윈도우상에서 자바가 돌아가는 것은 윈도우상에 JRE라는 Java Runtime Environment가 깔려있기 때문이다
우리가 안드로이드폰에서 보는 달빅이라는 가상머신도 JVM을 참조해서 만든것이다
728x90
'코스웨어 > 11년 내장형하드웨어' 카테고리의 다른 글
[내장형]이상만_Socket API, 저수준 입출력, grep / redirection명령어, TCP/IP 서론 요약 (15) | 2011.06.27 |
---|---|
[내장형]김정우 입니다. (0) | 2011.06.24 |
[내장형]윤병도 가입인사 (0) | 2011.06.24 |
[내장형]백길남 가입인사 드립니다. (0) | 2011.06.24 |
[내장형]이동현_가입인사 드립니다!! (0) | 2011.06.24 |
[내장형]박춘우_가입인사 (1) | 2011.06.24 |
글쓸 때 기본적으로 공개로 설정하세요(댓글 달 것) (13) | 2011.06.24 |
[내장형] 가입인사 (0) | 2011.06.24 |