블로그 이미지
송시혁

calendar

1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

Notice

Tag

Recent Post

Recent Comment

Recent Trackback

Archive

'unix/unix 실습'에 해당되는 글 3

  1. 2013.09.10 9월 10일 공유라이브러리와 jmp함수
  2. 2013.09.09 9월 9일
  3. 2013.09.02 9월 2일 파일과 디렉토리1.(정리 미완성)
2013. 9. 10. 10:52 unix/unix 실습


공유 라이브러리.


기존의 같은 함수를 다른 함수들이 그것을 공통적으로 사용할 경우 필요할 때만 받아서

사용하는 방법이다.


장점- 용량을 줄일 수 있다. (아래그림은 참고), 모든 프로그램을 다시 링크하지 않아도 

         라이브러리를 새 버전으로 대체 가능.


단점- 어떤 라이브러리가 갱신되거나, 처음 실행될때 버전이 맞지 않거나 공유 라이브러리 

         함수가 처음 호출될 때 실행파일이 생성되지 않을 때가 있다.(예 xp에서 도스게임이 잘 돌아가지 않는 경우)


DLL=DYNAMIC(동적인) LIBRARY(라이브러리) LINK(링크) 

 




다음은 공유라이브러리를 실행해서 컴파일 할 때와 안 할 때의 차이를 나타낸다.





1.    제일 위에 빨간색은 공유라이브러리를 사용한것.

2.    두번 째 빨간네모는 공유라이브러리를 사용하지 않았다.

       (gcc -static -o 실행파일 실행파일 소스)

3.    노란색 네모는 메모리 영역별로 소스의 용량크기를 나타낸다. 참고로 text는 stack영역.

 


다음 예제는 setjmp()함수와 longjmp()함수 소스



1.    setjmp인자는 jmp_buf형 위에서는 전역변수로 버퍼를 선언하여 인자를 넣었다.

       setjmp함수는 직접호출되면 0을 반환하므로, 실행되지 않는다.


그래서 else문에 void 형 함수 one을 호출

2.    one()함수안에 two()함수를 호출하고 실행한다. 그런데 longjmp()함수를 만난다.

      longjmp()로 인하여 main()함수로 점프한다. 그러니까 아래 printf("two end\n");를

 실행되지 않는다.

3. longjmp함수에 두번째 인자가 1이므로 setjmp함수로 가서 if문이 성립되어 아래 코드를 실행한 뒤

종료된다.


실행결과


























'unix > unix 실습' 카테고리의 다른 글

9월 9일  (0) 2013.09.09
9월 2일 파일과 디렉토리1.(정리 미완성)  (0) 2013.09.02
posted by 송시혁
2013. 9. 9. 19:38 unix/unix 실습


이번에는 시간을 나타내는 함수들을 알아본다. 컴퓨터의 시간은 1970.01.01이 기준으로 지금까지

흘러간 시간을 초(sec)단위로나타낸다.


time_t time(time_t *)


time_t 는 찾아보면 iong int형으로 define되어 있다.

 long int __time_t


이 함수는 현재 시간 및 날짜를 나타태는 함수이다. 단, 위에서도 말했듯이 1970.01.01기준이라는

것을 명심하자.


gettimeofday(struct timeval *restirct tp, void *restrict tzp);


struct timeval

{

time_t

페이지 207마지막 줄에 나와있다. 마이크로초단위로 시간을 나타내는 함수.

일단, 참고만 한다.





아래 그림은 gmtime함수를 이용하여 날짜와 시간등을 나타내는 것



1.2차원 배열로 원하는 문자열을 초기화(요일)을 만든다.

그리고 가장 핵심부분은 time_t iTime에서 설정한 숫자와 gmtime함수가 되겠다.


gmtime의 반환형이 time_t형이므로 변수 iTime을 선언하였다. iTime의 숫자는 2013녀 9월.9일 9시 16분50초

를 초로 계산한 값이다. (단, 한달에 28일, 31일같은 월은 전부 30일로 계산하였다. 그래서 아래 실행에서는

다소 오차가 발생한다. 그러나, 9시 16분 50초는 정확히 나온다.)


이것을 gmtiem함수 인자로 넣는다. gmtime(&iTime), 인자가 포인터형이라서 주소 '&'붙여서 넣었다.

그러면 아래 printf문과 같이 출력이 하면 된다. 


strftime함수는  위에서 일일이 하나하나 화면에 출력했던 것을 한 번에 출력한다. (위에는 개노가다 ㄷㄷ)

gmtime에서 반환한 값을 4번째 인자에 넣으면, 그것에 버퍼에 지정되 크기만큼 3번째 인자의 형식처럼 출력된다.

정리하자면, 다음과 같다.


1.버퍼

2.크기

3.문자열(주소, 여기서는 출력 형식)

4.화면에 출력할 값. 자료형은 struct tm* 형이다.



tm구조체가 time.h헤더 파일에 정의되어 있다.





아래 소스는 atexit()함수가 역순으로 종료됨을 보요주는 소스

이것은 책에서 예제 소스. 

원래 실행되고 종료되는 순서는 다음과 같다.

1. main()함수 시작.

2. main()안에 있는 함수 호출 및 실행.

3. 함수 종료 

4. main()함수 끝


이런 순서이다. 그러나 이소스에서는 atexit()함수는 좀 다르다. 

exit()함수의 일종으로 원래는 exit()함수또한 종료할 때 쓰인다. exit()함수는 각각의 프로세스를 닫는다.

예를 들어서, open()함수로 파일을 열었을 경우 close()함수로 닫아야 하는데, 중간에 exit()함수를 써도

알고리즘적으로 close()까지 처리하고 종료한다. return 0로 그렇지 않다. 그러나 exit()함수는 조심해야한다.

만약에  


exit 등록된 함수를 역순으로 종료한다. atexit()함수 또한 역순으로 프로세스를 처리한다. 


실행결과

first exit handler

first exit handler

second exit handler



환경변수 environ을 이용한 소스.




























































posted by 송시혁
2013. 9. 2. 13:50 unix/unix 실습





/dev/tty

>temp.foo

<>temp.foo



fcntl()함수의 옵션들이다. fcntl()함수는 옵션의 따라 반환값이 달라지는 함수라는 점을 명심하자.





위의 그림은 /home/smart라는 디렉토리를 만들어 group파일을 실행한 모습이다.



passwd파일을 실행한 모습이다.







디렉토리에서 파일의 목록이다. 잘 보면, 소유자 id와 group id가 같다. smart인 경우 smart smart라고

되어있다. 이것을 강제로 바꿀 수 있다.




제일 처음글자는 d는 디렉토리를 뜻한다.

명령어 chmod 444 smart를 치면, drwx~~~~가 dr--r--r--로 되어있다는 것을 알 수 있다.

4는 0100이므로 drwx가 dr--으로 바뀌는 셈이다. 제일 앞에 d는 구분표시이므로 해당사항이 없다.





group 파일에서 smart의 정보를 지운 그림이다. smart의 디렉토리 파일을 남아있므로 완벽히 지운것은

아니지만, group id부분이 숫자로 변경된것을 알 수 있다.



위그림은 passwd파일, group파일에서 smart의 관한 정보를 지운 그림.

둘다 번호로 보여준다는 것을 알 수 있다.













'unix > unix 실습' 카테고리의 다른 글

9월 10일 공유라이브러리와 jmp함수  (0) 2013.09.10
9월 9일  (0) 2013.09.09
posted by 송시혁
prev 1 next