본문 바로가기
코스웨어/11년 내장형하드웨어

[내장형]백길남_2011년 7월 20일 일일 보고서

by 알 수 없는 사용자 2011. 7. 20.
728x90
반응형

JAVA
자바는 프레임워크 입니다.
프레임워크는 어느정도까지 소스가 짜여져 있다는 말입니다.
(새로운 프로젝트 생성시)
자바는 클래스명 과 파일명이 동일해야합니다.

C샵은 클래스명 과 파일명이 틀려도 가능하나 자바는 불가능 합니다.
클래스명 과 파일명을 똑같이 만들어 줍시다.

 자바에서 프로그램은 메인에서 작성합니다.
입력을 받아들이는 방법은
Scanner sc = new Sanner(System.in)
로 입력을 받아 들일 수 있습니다.

Scanner 를 사용할시에 import java.util.Scanner 을 선언해 주어야하는데 이것을 편리하게 하는 방법입니다.

Ctrl + Shift + O 를 누르시면 밑의 그림처럼 나오게됩니다.

여기서 java.util.Scanner 을 선택하여 Finish 를 눌러주시면 소스에 추가되어 있는 것을 보실 수 있습니다.

image

 

자바가 설치된 곳을 찾아가면 lib (라이브러리 폴더가 있습니다.) 에 들어가면   .jar 라는 파일이 있습니다.

이파일이 프로그램에 JRE System Library 에 링크되어있습니다.

거기서 rt.jar 는 C 에서의 헤더 파일과 비슷한 기능을 갖추고 있습니다.

rt.jar 은 필요한 명령만 불러서 사용한다. 부르는 방법은 #import 를 사용합니다.

자바에서 생략되어 있는 것은 import java.lang.*; 입니다.

image

위 그림은 프로그램상에서 .jar 이 링크되어 있는 모습입니다.

[괄호 안에 변수 선언]

image

괄호 안쪽 과 밖은 서로 관여 할수 없기 때문에 출력을 할 수가 없습니다.

괄호 안쪽에서 변수를 선언하였다고 하여 괄호 밖에서 출력을 할수 없다는 것입니다.

[함수 사용예]

[소스]

image

[결과]

image 

image image

 

[final 문]

image

final 은 C 에서 define 한거와같습니다. 혹은 const 와 같습니다.

변수를 변경할수 없는 상수로 만들어줍니다.

위 그림에서 보면 pi 를 final 로 선언을 해놓고 소스 중간에 pi값을 변경 하는 것이 보입니다.

여기서 에러가 발생하게됩니다.

 

[ ! 문제 풀이 ! ]

(1번문제)

가로 와 세로의 크기를 입력받아 넓이를 출력하는 프로그램을 구현하세요.

[소스]

image

 [결과]

image

(2번문제)

변수 2개를 사용하여 값을 입력받은뒤 서로의 값을 교환하여 출력하세요.

[소스]

image

[출력]

image

(3번문제)

태어난 해 를 입력하여 몇살인지 나오는 프로그램을 구현하세요.

[소스]

image

[출력]

image


TCP/IP


하나의 프로그램에서 fork 함수를 사용해서 통신할떄

부모와 자식중 하나가 종료되었을때 다른하나는 종료되었는지 알수가 없다. 그러므로 하나가 종료될때 다른하나도 종료될수있도록 알려주어야합니다.

알려주는 방식으로 파이프 가 있습니다.

image

부모 와 자식 프로세는

메모리는 분리되어 있지만 소켓 과 파일을 공유합니다.

파이프 를 사용하여 부모 와 자식 프로세스 를 공유 할수있도록 만들어줍니다.

 

파이프를 생성하는 함수는 위 그림에 예시 되어있습니다.

배열로 선언이 되어있다. 그리고 파이프의 리턴형은 int 형입니다.

파이프를 생성하게되면 두개의 파일 디스크립터가 생성이된다. 두개의 파일 디스크립터는

fd[2] 에서 생성이됩니다.

fd 는 파일 디스크립터를 말합니다.

image

fd[0] = 파이프 출구

fd[1] = 파이프 입구

fd[0] = 자식프로세스 에게 파일을 입력할수있는 파일디스크립터

fd[1] = 부모프로세스 의 파일을 출력할수 있는 파일디스크립터

 

파이프로 부터 데이터를 받고자할때 fd[0]

파이프로 부터 데이터를 출력하고자할때 fd[1]

위 그림을 보면 이해에 도움이 됩니다.

위그림을 보면

젤처음에는 부모프로세스만있고 파이프 함수를 이용하여 파이프를 생성(파일디스크립터 를 만든다.)

부모프로세스는 fd[0]fd[1] 을 받는다. 그다음에 fork 함수를 호출합니다.

그러면 부모 와 똑같은 자식 프로세스가 생기므로 자식 프로세스에도 부모 프로세스와 똑같은

파이프 가 생성이 되어있습니다.

자식 과  부모의 fd[1] 은 파이프 입구와 연결이 되어 있고 f[0] 은 파이프의 출구와 연결이 되어 있게 되므로써

부모와 자식간에 데이터를 전송할수 있습니다.

 

[pipe 와 fork 함수 사용예 및 결과]

[자식에서 부모로 데이터를 주는 단방향]

image

위 코드에서보면

int 형 배열 fd 를 선언합니다. 여기에 파이프를 생성하였을때 입구 와 출구 를 받기위해서 선언한것입니다.

파이프 함수를 호출하여 fd 를 사용한 모습을 알수가 있습니다.

아직까지는 프로세스 하나로 파이프와 연결이 되어 있는 상태입니다.

state 를 사용하여 파이프 함수가 제대로 생성되었는 가 를 알아보는 소스입니다.

 

그리고 fork 함수를 사용하여 자식 프로세스를 생성합니다.

fork 함수의 리턴값을 pid 가 받고있는데 부모 프로세스는 자식프로세스의 프로세스ID 를 가지고있고

자식 프로세스는 0 을 가지고 있습니다.

자식프로세스에도 부모에서 만들었던 변수를 가지고있습니다.

pid 가 0 이라면은 자식프로세스일 경우를 말하고있습니다.

자식 프로세스일경우에는 good 이라는 글자를 쓰라고하고있습니다. 그뒤에 7 은 문자열의 길이를 나타내고있습니다.

fd[1] 을 통해서 파이프 쪽의 입구로 보내고있습니다.

else 문을 보면 –1 도 아니고 0 도 아닌값일경우는 부모프로세스를 말하게되는데 여기서

fd[0] 을 통해 나온 데이터가 BUFSIZE 크기만큼 buffer 에 저장되게 됩니다.

그리고 buffer 에 저장된 내용을 출력하게됩니다.

밑의 그림을 참조하세요.

image

image

 

[부모 와 자식간의 양방향 Pipe]

image

부모 와 자식간의 양뱡향 전송을 나타내고있습니다.

자식 프로세스가 ,write 를 이용하여 GOOD! 을 쓰고있습니다.

GOOD 를 부모 프로세스가 출력을 하게되고

부모 프로세스는 Really GOOD 는 자식 프로세스가 출력을 하게됩니다.

먼저 종료되는 것은 자식 프로세스 입니다. 부모 프로세스 쪽에 3초의 지연시간이 있기때문입니다.

 

자식 쪽에 sleep 함수가 없다면 어떻게될까요?

image

[결과]

image

결과가 위그림과 같이 나오는 이유는 자기가 쓴 내용을 자기가 읽어 버리기 때문에 부모프로세스로 데이터가

가지못하고 블로킹 상태에 빠지게됩니다.

파이프를 사용했을때 문제점은 자식 프로세스가 보낸 내용이 반드시 부모 프로세스가 내용을 받을수 없다는

것입니다.

부모 와 자식은 같은 파일 디스크립터로 접속하기때문에 생기는 문제입니다.

이문제를 해결하기 위해서 파이프를 하나더 만들어서 문제점을 해결할수가 있습니다.

image

파이프를 2개 만들어서 부모 와 자식 간의 양뱡향 통신을 원활하게 만들수 있습니다.

[파이프 함수를 2개 생성]

image

파이브 2개를 만들고 배열 2개를 만들었습니다.( fd1 과 fd2 )

처음 파이프 는 fd1 과 연결이 되고

두번째 파이프는 fd2 와 연결이 됩니다.

보충수업
[그림이 다 안보이신다면 클릭하셔서 크게 보시기 바랍니다.]

image

메인 헤더와 함수 파일 그리고 테스트 헤더와 함수 파일입니다.

메인 헤더에는 <stdio.h><stdlib.h><errno.h> 이 선언이 되어 있습니다.

extern 을 사용하면 연결된 함수에 별도의 변수 선언없이 extern 으로 선언된 변수를 사용할수가 있습니다.

static 은 전역변수 에 사용할때는 전연변수가 포함된 함수 외 에는 변수의 값을 변경할수 가 없습니다.

지역변수에 static 을 붙이면 함수가 끝나고 다시 시작하여도 그 값이 변하지 않습니다.

외부 변수에 static 을 붙이면 그 모듈 내에서만 사용 가능합니다.

헤더 파일에서 전역변수 를 사용할 수 있게 해줍니다.

[리눅스 결과]

image

[윈도우즈 결과]

image

extern 에 대해서 잘아시는 분은 알려주시기 바랍니다.^^

728x90