본문내용
1. 개요
fork()와 pipe()함수의 사용을 이용한 프로그램을 작성하여 fork()의 자식과 부모프로세서
의 관계의 이해와 pipe()함수의 통신원리를 이해하는 것을 목적으로 한다. 시스템 내에서
의 fork()를 이용한 concurrent한 심판자의 구성과 pipe()함수를 이용한 변수값의 전달을
능숙하게 함으로써 local에서의 통신 뿐 아니라 네트워크상에서의 통신까지도 가능할 수
있도록 하기 위해 이 프로그램을 작성하게 되었다.
2. 전체 구조
(1) 제시된 문제 조건
▶ 몇 명의 사용자인지를 먼저 결정한다.
▶ 각 사용자별로 1에서 5 사이의 숫자들을 임의로 나열한다.
▶ 한 명의 사용자가 입력이 끝나면 화면을 모두 지우고 그 다음 사용자의 입력을
받는다.
▶ 모든 사용자의 입력이 끝나면 각 사용자들이 입력한 숫자들을 서로 비교한다.
▶ 총점을 계산하여 출력한다.
▶ 점수 계산 방식
- 자신이 입력한 숫자가 다른 사용자 것보다 크면
승리한 사람마다 +3, 동일한 경우 +1점, 작으면 0점
입력한 다섯개의 숫자들을 서로 비교하여 총점을 계산.
▶ 1에서 5까지의 수중 수를 한번씩만 사용했는지를 점검
▶ 결과 점수 표시
▶ 사용자가 입력한 데이터 표시
(2) 사용자로부터 일어날 수 있을 사건
사용자 프 로 그 램 처 리
(3) 프로그램 구성도
3. 모듈별 설명
(1) makefile 구성
(구성도와 같은 구조로 이루어져 있음)
(2) main.c 모듈
(3) player.c 모듈
(4) clear.c 모듈
(5) clear 쉘프로그램
(6) simpan.c 모듈
(7) simpan2 모듈
4. 출력결과
(숫자 5가 중복으로 입력 되었을 경우)
(계속 재입력 요구)
(5번째 숫자 입력후 clear 호출)
(clear 후의 모습 -아래그림-)
(동점일 경우)
(비기지 않았을 경우)
4. 분석 및 토론
문제점 1
사용자의 수대로 포크를 생성하고자 하여 for문을 이용하여 사용자 수만큼 포크시킬
경우 자식프로세서에서 자신을 부모로 인식하여 포크를 한번씩 더하여 사용자의 수만
큼만 포크를 시키는 것이 불가능했다.
해결1
반복문을 사용하지 않고 포크를 하는 함수를 따로 생성했다. plyer() 또한 매개변
수로써 사용자의 수를 받아 사용자의 수만큼 자신을 호출하여 포크를 하는방식으로
해결을 할 수 있었다.
문제점 2
simpan.c에서 임시적으로 파일에 데이터를 쓰고 simpan2.c데이터를 지우는 기능에서
execl()함수를 사용하였다. 하지만 execl() 함수는 return값이 없이 그 상황에서 프로
세서를 종료시키기 때문에 simpan2.c의 기능이 전부 수행되지 못했다.
해결 2
simpan2에서 fork의 사용으로 자식프로세서에서 execl을 실행시키고 부모프로세서에서
는 다른 기능을 구현함으로써 자식이 execl을 수행한 뒤 바로 종료되고 부모는 부모의
기능을 전부 수행할 수 있었다.
문제점 3
문제 2에서 자식프로세서를 이용해서 해결할 수 있었던 문제가 자식프로세서가 부모프
로세서에서 파일을 일기전에 먼저 파일을 지워버려 파일open에 실패하는 경우가 생기
게 되었다.
해결 3
sleep()함수를 이용하여 적단한 시간을 주어 먼저 종료 되지않도록 해결하였다.
문제점 4
simpan.c 모듈에서 simpan2.c를 호출하여 파일의 내용을 읽어햐 하는데 simpan.c가
포크되어 포크된 순서데로 읽게되면 자료가 중복으로 읽혀서 자료의 처리가 제대로
되지 않는 문제가 있다.
해결 4
simpan.c 모듈에서 player의 수를 체크하여 마지막 player를 가르키는 포크일때만
수행하도록하여 해결할 수 있었다.
문제점 5
pipe를 사용하여 데이터를 넘길 때 malloc을 사용하여 자료를 주고받고 하게되면
pipe의 특성상 문자형으로 굳이 바꿔야만 한다. int형으로 바로 쓸 수는 없는것인가.
해결 5
파일입출력을 사용하여 int 형으로 쓰고 int 형으로 읽음으로써 문제를 해결할 수
있었다.
문제점 6
파일을 쓰고 읽을 때 정수형으로 쓴 후 fscanf(fd,"%d",&a[i][j]) 이런식으로 중첩반복
문을 사용하여 배열한칸에 int형 하나씩을 받아 처리하려고 했으나 a[0][0]에 모든 인
수가 전부 들어가고 나머지 공간에는 쓰레기 값이 들어가서 처리할 수 없었다.
해결 6
파일을 fprintf로 쓸 때 fprintf(fd,"%d",변수) "%d" 가 아닌 "%d " 로 해주어야한다.
파일을 쓸 때 공백(space)를 하나씩 주면 파일을 int형으로 읽을 때 숫자하나씩 읽
는 것이 가능해지기 때문에 이문제도 해결 할 수 있었다.
목 차
Hallym University made 20025315 한태원
과목 : 시스템프로그래밍 지도교수: 이완연 교수님
1. 개요
2. 전체 구조
(1) 제시된 기능
(2) 사용자로부터 일어날 수 있는 사건
(3) 구성도
3. 모듈별 설명
(1) make 모듈 설명
(2) main 모듈 설명
(3) player 모듈 설명
(4) clear 모듈 설명
(5) simpan 모듈 설명
(6) simpan2 모듈 설명
4. 분석 및 토론
시스템프로그래밍
과제 : fork()와 pipe()를 이용한 숫자게임 만들기
제출날짜 :2004 년 6월 3일 (목요일)
제출자 : 정보통신공학부 3학년
한태원(20025315)
fork()와 pipe()함수의 사용을 이용한 프로그램을 작성하여 fork()의 자식과 부모프로세서
의 관계의 이해와 pipe()함수의 통신원리를 이해하는 것을 목적으로 한다. 시스템 내에서
의 fork()를 이용한 concurrent한 심판자의 구성과 pipe()함수를 이용한 변수값의 전달을
능숙하게 함으로써 local에서의 통신 뿐 아니라 네트워크상에서의 통신까지도 가능할 수
있도록 하기 위해 이 프로그램을 작성하게 되었다.
2. 전체 구조
(1) 제시된 문제 조건
▶ 몇 명의 사용자인지를 먼저 결정한다.
▶ 각 사용자별로 1에서 5 사이의 숫자들을 임의로 나열한다.
▶ 한 명의 사용자가 입력이 끝나면 화면을 모두 지우고 그 다음 사용자의 입력을
받는다.
▶ 모든 사용자의 입력이 끝나면 각 사용자들이 입력한 숫자들을 서로 비교한다.
▶ 총점을 계산하여 출력한다.
▶ 점수 계산 방식
- 자신이 입력한 숫자가 다른 사용자 것보다 크면
승리한 사람마다 +3, 동일한 경우 +1점, 작으면 0점
입력한 다섯개의 숫자들을 서로 비교하여 총점을 계산.
▶ 1에서 5까지의 수중 수를 한번씩만 사용했는지를 점검
▶ 결과 점수 표시
▶ 사용자가 입력한 데이터 표시
(2) 사용자로부터 일어날 수 있을 사건
사용자 프 로 그 램 처 리
(3) 프로그램 구성도
3. 모듈별 설명
(1) makefile 구성
(구성도와 같은 구조로 이루어져 있음)
(2) main.c 모듈
(3) player.c 모듈
(4) clear.c 모듈
(5) clear 쉘프로그램
(6) simpan.c 모듈
(7) simpan2 모듈
4. 출력결과
(숫자 5가 중복으로 입력 되었을 경우)
(계속 재입력 요구)
(5번째 숫자 입력후 clear 호출)
(clear 후의 모습 -아래그림-)
(동점일 경우)
(비기지 않았을 경우)
4. 분석 및 토론
문제점 1
사용자의 수대로 포크를 생성하고자 하여 for문을 이용하여 사용자 수만큼 포크시킬
경우 자식프로세서에서 자신을 부모로 인식하여 포크를 한번씩 더하여 사용자의 수만
큼만 포크를 시키는 것이 불가능했다.
해결1
반복문을 사용하지 않고 포크를 하는 함수를 따로 생성했다. plyer() 또한 매개변
수로써 사용자의 수를 받아 사용자의 수만큼 자신을 호출하여 포크를 하는방식으로
해결을 할 수 있었다.
문제점 2
simpan.c에서 임시적으로 파일에 데이터를 쓰고 simpan2.c데이터를 지우는 기능에서
execl()함수를 사용하였다. 하지만 execl() 함수는 return값이 없이 그 상황에서 프로
세서를 종료시키기 때문에 simpan2.c의 기능이 전부 수행되지 못했다.
해결 2
simpan2에서 fork의 사용으로 자식프로세서에서 execl을 실행시키고 부모프로세서에서
는 다른 기능을 구현함으로써 자식이 execl을 수행한 뒤 바로 종료되고 부모는 부모의
기능을 전부 수행할 수 있었다.
문제점 3
문제 2에서 자식프로세서를 이용해서 해결할 수 있었던 문제가 자식프로세서가 부모프
로세서에서 파일을 일기전에 먼저 파일을 지워버려 파일open에 실패하는 경우가 생기
게 되었다.
해결 3
sleep()함수를 이용하여 적단한 시간을 주어 먼저 종료 되지않도록 해결하였다.
문제점 4
simpan.c 모듈에서 simpan2.c를 호출하여 파일의 내용을 읽어햐 하는데 simpan.c가
포크되어 포크된 순서데로 읽게되면 자료가 중복으로 읽혀서 자료의 처리가 제대로
되지 않는 문제가 있다.
해결 4
simpan.c 모듈에서 player의 수를 체크하여 마지막 player를 가르키는 포크일때만
수행하도록하여 해결할 수 있었다.
문제점 5
pipe를 사용하여 데이터를 넘길 때 malloc을 사용하여 자료를 주고받고 하게되면
pipe의 특성상 문자형으로 굳이 바꿔야만 한다. int형으로 바로 쓸 수는 없는것인가.
해결 5
파일입출력을 사용하여 int 형으로 쓰고 int 형으로 읽음으로써 문제를 해결할 수
있었다.
문제점 6
파일을 쓰고 읽을 때 정수형으로 쓴 후 fscanf(fd,"%d",&a[i][j]) 이런식으로 중첩반복
문을 사용하여 배열한칸에 int형 하나씩을 받아 처리하려고 했으나 a[0][0]에 모든 인
수가 전부 들어가고 나머지 공간에는 쓰레기 값이 들어가서 처리할 수 없었다.
해결 6
파일을 fprintf로 쓸 때 fprintf(fd,"%d",변수) "%d" 가 아닌 "%d " 로 해주어야한다.
파일을 쓸 때 공백(space)를 하나씩 주면 파일을 int형으로 읽을 때 숫자하나씩 읽
는 것이 가능해지기 때문에 이문제도 해결 할 수 있었다.
목 차
Hallym University made 20025315 한태원
과목 : 시스템프로그래밍 지도교수: 이완연 교수님
1. 개요
2. 전체 구조
(1) 제시된 기능
(2) 사용자로부터 일어날 수 있는 사건
(3) 구성도
3. 모듈별 설명
(1) make 모듈 설명
(2) main 모듈 설명
(3) player 모듈 설명
(4) clear 모듈 설명
(5) simpan 모듈 설명
(6) simpan2 모듈 설명
4. 분석 및 토론
시스템프로그래밍
과제 : fork()와 pipe()를 이용한 숫자게임 만들기
제출날짜 :2004 년 6월 3일 (목요일)
제출자 : 정보통신공학부 3학년
한태원(20025315)
소개글