JAVA
자바는 프레임워크 입니다.
프레임워크는 어느정도까지 소스가 짜여져 있다는 말입니다.
(새로운 프로젝트 생성시)
자바는 클래스명 과 파일명이 동일해야합니다.
C샵은 클래스명 과 파일명이 틀려도 가능하나 자바는 불가능 합니다.
클래스명 과 파일명을 똑같이 만들어 줍시다.
자바에서 프로그램은 메인에서 작성합니다.
입력을 받아들이는 방법은
Scanner sc = new Sanner(System.in)
로 입력을 받아 들일 수 있습니다.
Scanner 를 사용할시에 import java.util.Scanner 을 선언해 주어야하는데 이것을 편리하게 하는 방법입니다.
Ctrl + Shift + O 를 누르시면 밑의 그림처럼 나오게됩니다.
여기서 java.util.Scanner 을 선택하여 Finish 를 눌러주시면 소스에 추가되어 있는 것을 보실 수 있습니다.
자바가 설치된 곳을 찾아가면 lib (라이브러리 폴더가 있습니다.) 에 들어가면 .jar 라는 파일이 있습니다.
이파일이 프로그램에 JRE System Library 에 링크되어있습니다.
거기서 rt.jar 는 C 에서의 헤더 파일과 비슷한 기능을 갖추고 있습니다.
rt.jar 은 필요한 명령만 불러서 사용한다. 부르는 방법은 #import 를 사용합니다.
자바에서 생략되어 있는 것은 import java.lang.*; 입니다.
위 그림은 프로그램상에서 .jar 이 링크되어 있는 모습입니다.
[괄호 안에 변수 선언]
괄호 안쪽 과 밖은 서로 관여 할수 없기 때문에 출력을 할 수가 없습니다.
괄호 안쪽에서 변수를 선언하였다고 하여 괄호 밖에서 출력을 할수 없다는 것입니다.
[함수 사용예]
[소스]
[결과]
[final 문]
final 은 C 에서 define 한거와같습니다. 혹은 const 와 같습니다.
변수를 변경할수 없는 상수로 만들어줍니다.
위 그림에서 보면 pi 를 final 로 선언을 해놓고 소스 중간에 pi값을 변경 하는 것이 보입니다.
여기서 에러가 발생하게됩니다.
[ ! 문제 풀이 ! ]
(1번문제)
가로 와 세로의 크기를 입력받아 넓이를 출력하는 프로그램을 구현하세요.
[소스]
[결과]
(2번문제)
변수 2개를 사용하여 값을 입력받은뒤 서로의 값을 교환하여 출력하세요.
[소스]
[출력]
(3번문제)
태어난 해 를 입력하여 몇살인지 나오는 프로그램을 구현하세요.
[소스]
[출력]
TCP/IP
하나의 프로그램에서 fork 함수를 사용해서 통신할떄
부모와 자식중 하나가 종료되었을때 다른하나는 종료되었는지 알수가 없다. 그러므로 하나가 종료될때 다른하나도 종료될수있도록 알려주어야합니다.
알려주는 방식으로 파이프 가 있습니다.
부모 와 자식 프로세는
메모리는 분리되어 있지만 소켓 과 파일을 공유합니다.
파이프 를 사용하여 부모 와 자식 프로세스 를 공유 할수있도록 만들어줍니다.
파이프를 생성하는 함수는 위 그림에 예시 되어있습니다.
배열로 선언이 되어있다. 그리고 파이프의 리턴형은 int 형입니다.
파이프를 생성하게되면 두개의 파일 디스크립터가 생성이된다. 두개의 파일 디스크립터는
fd[2] 에서 생성이됩니다.
fd 는 파일 디스크립터를 말합니다.
fd[0] = 파이프 출구
fd[1] = 파이프 입구
fd[0] = 자식프로세스 에게 파일을 입력할수있는 파일디스크립터
fd[1] = 부모프로세스 의 파일을 출력할수 있는 파일디스크립터
파이프로 부터 데이터를 받고자할때 fd[0]
파이프로 부터 데이터를 출력하고자할때 fd[1]
위 그림을 보면 이해에 도움이 됩니다.
위그림을 보면
젤처음에는 부모프로세스만있고 파이프 함수를 이용하여 파이프를 생성(파일디스크립터 를 만든다.)
부모프로세스는 fd[0]fd[1] 을 받는다. 그다음에 fork 함수를 호출합니다.
그러면 부모 와 똑같은 자식 프로세스가 생기므로 자식 프로세스에도 부모 프로세스와 똑같은
파이프 가 생성이 되어있습니다.
자식 과 부모의 fd[1] 은 파이프 입구와 연결이 되어 있고 f[0] 은 파이프의 출구와 연결이 되어 있게 되므로써
부모와 자식간에 데이터를 전송할수 있습니다.
[pipe 와 fork 함수 사용예 및 결과]
[자식에서 부모로 데이터를 주는 단방향]
위 코드에서보면
int 형 배열 fd 를 선언합니다. 여기에 파이프를 생성하였을때 입구 와 출구 를 받기위해서 선언한것입니다.
파이프 함수를 호출하여 fd 를 사용한 모습을 알수가 있습니다.
아직까지는 프로세스 하나로 파이프와 연결이 되어 있는 상태입니다.
state 를 사용하여 파이프 함수가 제대로 생성되었는 가 를 알아보는 소스입니다.
그리고 fork 함수를 사용하여 자식 프로세스를 생성합니다.
fork 함수의 리턴값을 pid 가 받고있는데 부모 프로세스는 자식프로세스의 프로세스ID 를 가지고있고
자식 프로세스는 0 을 가지고 있습니다.
자식프로세스에도 부모에서 만들었던 변수를 가지고있습니다.
pid 가 0 이라면은 자식프로세스일 경우를 말하고있습니다.
자식 프로세스일경우에는 good 이라는 글자를 쓰라고하고있습니다. 그뒤에 7 은 문자열의 길이를 나타내고있습니다.
fd[1] 을 통해서 파이프 쪽의 입구로 보내고있습니다.
else 문을 보면 –1 도 아니고 0 도 아닌값일경우는 부모프로세스를 말하게되는데 여기서
fd[0] 을 통해 나온 데이터가 BUFSIZE 크기만큼 buffer 에 저장되게 됩니다.
그리고 buffer 에 저장된 내용을 출력하게됩니다.
밑의 그림을 참조하세요.
[부모 와 자식간의 양방향 Pipe]
부모 와 자식간의 양뱡향 전송을 나타내고있습니다.
자식 프로세스가 ,write 를 이용하여 GOOD! 을 쓰고있습니다.
GOOD 를 부모 프로세스가 출력을 하게되고
부모 프로세스는 Really GOOD 는 자식 프로세스가 출력을 하게됩니다.
먼저 종료되는 것은 자식 프로세스 입니다. 부모 프로세스 쪽에 3초의 지연시간이 있기때문입니다.
자식 쪽에 sleep 함수가 없다면 어떻게될까요?
[결과]
결과가 위그림과 같이 나오는 이유는 자기가 쓴 내용을 자기가 읽어 버리기 때문에 부모프로세스로 데이터가
가지못하고 블로킹 상태에 빠지게됩니다.
파이프를 사용했을때 문제점은 자식 프로세스가 보낸 내용이 반드시 부모 프로세스가 내용을 받을수 없다는
것입니다.
부모 와 자식은 같은 파일 디스크립터로 접속하기때문에 생기는 문제입니다.
이문제를 해결하기 위해서 파이프를 하나더 만들어서 문제점을 해결할수가 있습니다.
파이프를 2개 만들어서 부모 와 자식 간의 양뱡향 통신을 원활하게 만들수 있습니다.
[파이프 함수를 2개 생성]
파이브 2개를 만들고 배열 2개를 만들었습니다.( fd1 과 fd2 )
처음 파이프 는 fd1 과 연결이 되고
두번째 파이프는 fd2 와 연결이 됩니다.
보충수업
[그림이 다 안보이신다면 클릭하셔서 크게 보시기 바랍니다.]
메인 헤더와 함수 파일 그리고 테스트 헤더와 함수 파일입니다.
메인 헤더에는 <stdio.h><stdlib.h><errno.h> 이 선언이 되어 있습니다.
extern 을 사용하면 연결된 함수에 별도의 변수 선언없이 extern 으로 선언된 변수를 사용할수가 있습니다.
static 은 전역변수 에 사용할때는 전연변수가 포함된 함수 외 에는 변수의 값을 변경할수 가 없습니다.
지역변수에 static 을 붙이면 함수가 끝나고 다시 시작하여도 그 값이 변하지 않습니다.
외부 변수에 static 을 붙이면 그 모듈 내에서만 사용 가능합니다.
헤더 파일에서 전역변수 를 사용할 수 있게 해줍니다.
[리눅스 결과]
[윈도우즈 결과]
'코스웨어 > 11년 내장형하드웨어' 카테고리의 다른 글
[내장형]하드웨어 최성태 (10) | 2011.07.25 |
---|---|
[내장형]윤병도_20110722 JAVA(클래스,getter/setter함수),멀티플렉싱(select함수) (17) | 2011.07.22 |
[내장형]공정우-2011.7.21(목) 일일보고서 (9) | 2011.07.22 |
[내장형]김수만_배고픈 금붕어 관찰일지 >_< (19) | 2011.07.21 |
[내장형]이영진_7월 19일 일일보고서 (12) | 2011.07.20 |
[내장형]박춘우_7월18일 월요일 Daily Report (26) | 2011.07.18 |
[내장형]한원우_7월 15일 일일보고서 (29) | 2011.07.17 |
[내장형]이동현_7월14일_일일보고서 (19) | 2011.07.14 |