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 )