2010년 9월 25일 토요일

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 )

댓글 없음:

댓글 쓰기