2010년 9월 25일 토요일

myadd 프로그램을 수정하기

목표:  
myadd 프로그램을 수정하여
                                음수 입력도 가능하게 만들기.


1. myadd 파일의 이해

- cmdlines.tar.gz의 압축을 해제하고, 본격적으로 수정할 소스가 있는
  cmdlines  폴더에 들어갑니다.
- RCS 폴더만이 있고 #make myadd를 입력합니다.
- 수업중에 간단하게 작성한 Makefile에 의해서 myadd 및 기타파일을 생성
  되고,  다시 #make clean을 입력하면 clean 설정된 모든 파일을 삭제합니다.
  (결국, myadd를 제외한 모든 파일은 삭제됩니다. )


2. myadd 파일 수정.
- 수업중에 수정한 음수 입력이 되지 않는 상태의  options.h options.c myadd.c
   파일을 활용하였습니다.
- RCS로 버전관리를 하면서 소스를 수정하였습니다.
-  음수를 인식 할 수 없는 이유는,  숫자가 (-)와 함께 들어오면
   알수 없는 인자로 판단이 되기 때문입니다.
-  while 문의 조건절에서 getopt_long 함수의 인자 중 숫자 이용해 음수도
    인식하게 하였습니다.


3. Makefile 생성.

-  Makefile이란?
  보통 라인 수가 많아지면 여러 개의 파일로 나누어 (모듈로 나누어)
개발을 하게 됩니다. 이들은 알게 모르게 서로 관계를 가지고 있는데,
어느 하나를 필요에 의해 바꾸게 되었을 때 그 파일에 있는 함수를 이용
하는 다른 파일도새롭게 컴파일되어야 합니다.  하지만 파일 수가 많은
경우 이를 일일이 컴파일을 하게 될 때, 그 불편함과 함께 컴파일하지
않아도 될 것도 컴파일을 하게 될 수도 있고, 컴파일해야 할 것도 미처
못하게 되는 경우가 있습니다. 이런 상황에서 지능적으로 관계 있는 것만
새롭게 갱신을 할 필요가 있을 때 make파일은 사용하게 됩니다. 하지만
make 명령은 내장된 지식을 많이 가지고 있지만 스스로 응용프로 그램을
빌드하는 방법을 알지는 못하기 때문에 make가 응용프로그램을 어떻게
생성하는지 알려줘야하는데 이 파일을 Makefile이라고 합니다.

- myadd가 만들어지기 위해서는 myadd.o, options.o가 필요하고 각각의 목적
  파일들은 모두 자신의 소스 파일과 *.h 에 의존을 합니다.
  그러므로, 다으과 같이 Makefile을 작성하였습니다.
   myadd: myadd.o options.o
   myadd.o: myadd.c options.h
   options.o: options.c options.h

- clean을 설정하여 #make clean을 입력하면 myadd를 제외한 모든파일이
  삭제되도록 하였습니다.
  
# TIP #  매크로의 사용

Makefile을 보면 교수님이 작성한 것과 같이 간단한 매크로 기능을 사용할 수
있습니다.

예) main.o read.o write.o라는 것을 OBJECTS 라는 매크로로 바꾸기.

OBJECTS = main.o read.o write.o

test : $(OBJECTS)
                gcc -o test $(OBJECTS)

main.o : io.h main.c
                gcc -c main.c
read.o : io.h read.c
                gcc -c read.c
write.o: io.h write.c
                gcc -c write.c


 위에서 보다시피 매크로는 그냥 프로그램 짤 때와 같이 사용해서 값을
대입합니다.  대신 사용할 때는 반드시 $(..) 안에 넣어서 사용합니다.


4. 압축하기

 tar cvf myadd.tar RCS/
  (RCS폴더에 있는 파일들을 myadd.tar로 압축하였습니다.)
- gzip myadd.tar
  (myadd.tar 압축파일을 myadd.tar.gz의 형태로 압축하였습니다.)


# 압축풀기gunzip filename.tar.gz
 ( tar.gz에서 gz를 풉니다..)
tar xvf filename.tar  
( tar를 풀어냅니다.  x : 압축풀기, v : 압축푸는 상태 보기, f : 파일 이름)
tar xvzf filename.tar.gz  
( tar.gz를 한번에 풉니다. 안될 경우 위의 순차적인 방법으로 합니다.)

# 압축하기
tar cvf filename.tar file1 file2   
( file1 file2 등의 파일이나 폴더를 filename.tar로 묶습니다.)
gzip filename.tar                    
( filename.tar를 filename.tar.gz로 압축합니다.)
tar cvzf filename.tar.gz file1 file2  
( file1 file2 등의 파일이나 폴더를 filename.tar.gz로 한번에 묶고 압축합니다.)
 
 
5. 동작확인
- tar xvzf myadd.tar.gz 을 입력하여 압축을 해제합니다.
- 압축을 풀면 RCS폴더 하나가 생성된것을 볼 수 있습니다.
- RCS폴더에 들어가지 말고 들어가기 전에 #make를 입력합니다.
   (myadd를 포함한 *.o, *.c *.h등의 파일들이 생성된것을 볼 수 있습니다.)
- ./myadd를 통하여 프로그램을 실행시키면 음수가 계산되는 것을 볼 수
   있습니다.
 
 
# make clean
 
 
 
 
 
 
 
- make clean을 입력하면 myadd 파일을 제외한 모든  파일이 삭제되는
 것을 볼 수 있습니다.
 
 
# 파일첨부 #  ( myadd.tar.gz )

mycmd 프로그램 작성하기

학습목표:
Linux 명령어, System Call, 디버깅 등에 대한 이해

 1. mycmd의 동작 이해

- mycmd 실행 결과: (1.clock  2.Processes  3.Editor  4.Exit ) 출력.
- 각 해당번호 입력 입력시 프로그램 실행.
- 1, 2, 3, 4 이외의 번호 입력시 (1.clock  2.Processes  3.Editor  4.Exit ) 재출력.
- 하나의 프로그램 실행 후 다른 해당번호를 입력하면 프로그램 실행 가능.
- 하나의 프로그램 실행 후 다른 해당번호를 입력하지 않으면 프로그램 종료.

2. emacs를 실행하여 위의 동작을 할 수 있는 코드작성.


※ 작성한 코드는 파일로 첨부.

- geetchar()를 이용하여 문자를 입력받고 이에 따라서 각각 동작하도록 if-else
  문 형태를 활용하였습니다.
- swich문을 이용하면 좀 더 간단했겠지만 알 수 없는 오류가 발생해서
  if - else if 문을 사용하였습니다.

※ 주요함수

 forc() 함수

 fork()함수는 호출한 프로세스의 복사본 프로세스를 생성합니다.
실패할 경우 -1을 리턴합니다. 성공할 경우 프로세스가 둘로 나뉘어서
원본 프로세스와  복사본 프로세스에게 전달되는 리턴값이 다릅니다.
원본 프로세스의 리턴값은 복사본 프로세스 ID이고, 복사본 프로세스의
리턴 값은 0입니다. fork() 함수 호출 성공시, 부모 프로세스는 자식 프
세스의 ID를 리턴받고 fork 함수 호출 이후를 실행하게 되고 자식 프로
세스역시 0을 리턴받고 fork함수 호출 이후를 실행하게 됩니다. 실행의
흐름이 두 갈래로 나뉩니다. 그러나 부모프로세스와 자식 프로세스는
같은 프로그램 코드를 서로 다른 공간에서 실행하므로 데이터의 공유는
일어나지 않습니다. 독립된 두 개의 프로그램이 실행되는 것입니다.

  exec() 함수
- 호출하는 프로세스를 새로운 프로세스로 변경시키는데 사용합니다,
- exec후, 프로세스의 개수는 그대로 이면 그 프로세스의 PID 번호도
  변경되지 않지만, 프로세스의 내용이 변경됩니다.
- 복귀값
  exec()는 성공적으로 마쳐진 경우에는 제어가 복귀되지 않고, 오류
  발생시만  -1값을 복귀시킵니다.
형식
  execl (char*path, char*argo, char*arg1,………,NULL)
  execv (char*path, char**argv)
  execlp(char*filename, char*argo, char*arg1,………,NULL)
  execvp(char*filename, char**argv)
 
  path        실행화일이 있는 곳까지의 전체 경로 이름
  argo         실행하고자 하는 프로그램 이름
  arg1~argn 실행하고자 하는 프로그램의 인수들
  avgv         실행하고자 하는 프로그램의 인수들의 배열
  filename    실행하고자 하는 프로그램 이름
3. RCS를 통한 버전관리 및 작성 프로그램 실행.

4. gdb를 이용한 디버깅 실행.





































 먼저 컴파일 시 디버깅 정보를 삽입하기 위해서 반드시 -g 옵션을 추가하도록 하며 gdb의 인자로 디버깅할 파일 이름을 적어줍니다.
 cc -g -o gdb_test (파일명)
 gdb  gdb_test
그럼 gdb 정보와 함께 (gdb) 콘솔 command로 바뀝니다.
일단 gdb상에서 이 프로그램을 돌려봅니다. 명령어는 run 입니다.

5. Makefile 작성
- Makefile은 명령(command)부분에 정의된 명령들은 의존 관계(depenency)부분에 정의된 파일의 내용이 바뀌었거나, 목표 부분에 해당하는 파일이 없을 때 이곳에 정의된 것들이 차례대로 실행이 됩니다. 가령, mcmd.c를 고쳤다고 생각한다면 mycmd.o가 컴파일되어 다시 생기고, mycmd 도 다시 링크되어 갱신됩니다.

- mycmd: mycmd.o ( mycmd.o 를 통해 mycmd.를 만들게 됩니다. )
- mycmd.o: mycmd.c ( mycmd.c 를 통해 mycmd.o.를 만들게 됩니다. )

- clean을 이용하여 지우고자 하는 파일을 설정할 수 있습니다.

※ 가끔 Makefile을 통한 make 잘 안된다는 분.
- 정확히 이해가 가지 않는 부분이지만 본인의 경우에는 Makefile을 RCS를 통해서
  버전 관리를 하지 않을 경우 make가 제대로 동작하지 않는 경우가 발생하였습니다.
ex)
- RCS를 통한 버전관리:
 압축되어있는 파일을 압축을 푼 후 처음 보이는 폴더에서 바로 make입력시 실행파일 생성.
-버전관리를 안한 Makefile
 압축되어있는 파일을 압축을 푼 후 처음 보이는 폴더에서 바로 make되지 않고 그 폴더안에 들어간 후 make입력 시 실행파일 생성.

6. 압축하기




































- 압축풀기

gunzip filename.tar.gz
 ( tar.gz에서 gz를 풉니다..)
tar xvf filename.tar   
( tar를 풀어냅니다.  x : 압축풀기, v : 압축푸는 상태 보기, f : 파일 이름)
tar xvzf filename.tar.gz  
( tar.gz를 한번에 풉니다. 안될 경우 위의 순차적인 방법으로 합니다.)

- 압축하기
tar cvf filename.tar file1 file2   
( file1 file2 등의 파일이나 폴더를 filename.tar로 묶습니다.)
gzip filename.tar                    
( filename.tar를 filename.tar.gz로 압축합니다.)
tar cvzf filename.tar.gz file1 file2  
( file1 file2 등의 파일이나 폴더를 filename.tar.gz로 한번에 묶고
                                                     압축합니다.)

7. 동작여부 확인

- 압축을 풀면 압축되어있던 폴더가 생성되고 그 상태에서 make를 입력하면
   사전에 만들어놓은 Makefile에 의해서 mycmd라는 실행파일이 생성됩니다.


make clean이라고 입력을 하게되면 Makefile에서 clean에 설정해 놓은 파일들이 모두 삭제됩니다.



- mycmd라는 실행파일과 mycmd.c를 제외한 모든 파일들이 삭제된 것을 볼 수 있습니다.


# 첨부파일 #   ( mycmd.tar.gz )