성엽이
KKIMSSI
성엽이
전체 방문자
오늘
어제
  • 분류 전체보기 (454)
    • :) (2)
    • C프로그래밍이론 (9)
    • C++프로그래밍 (64)
      • STL (1)
    • C# (2)
    • Visual studio 10.0 (9)
    • AT91SAM7S256 (21)
    • 논리회로 (14)
    • AVR2560 (11)
    • TCPIP (16)
    • NetWork (4)
      • Ubuntu Linux (2)
    • Assembly (21)
    • UNIX 프로그래밍 (6)
    • RFID 분석 (1)
    • Win32 API (7)
    • Cortex-M3 (4)
    • Unity (91)
    • Flutter (9)
    • OwnProject (11)
      • It's mine (5)
      • 마인드스톰 실습 (1)
      • 보고서 자료 (2)
      • RPi B+ (2)
    • ETC (25)
      • 상식 (3)
    • MFC (40)
    • PostgeSQL (18)
    • 영상제어 (6)
      • VFW_영상처리 (1)
    • Python (0)
    • Java (30)
      • SpringBoot (2)
      • Javascript (1)
      • JSP (13)
      • Spring (8)
    • Oracle (4)
      • SQL (3)
    • HTML (6)
      • Thymeleaf (1)
      • CSS (1)
      • Bootstrap (3)
    • IDE (1)
      • VS Code (1)
    • Android (2)
    • Privacy Policy (0)
    • MYSQL (2)
      • MariaDB (2)
    • AWS (5)
    • 개인공부 (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록
  • 관리자
  • 글쓰기

공지사항

인기 글

태그

  • MFC
  • 문자열 나누기
  • WINAPI
  • Boot Code 분석
  • ARM Reverse Engineering

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
성엽이

KKIMSSI

2013.09.10_UNIX_7.7(DLL)~setjmp,longjmp 함수
UNIX 프로그래밍

2013.09.10_UNIX_7.7(DLL)~setjmp,longjmp 함수

2013. 9. 10. 14:15

공유 라이브러리 ( Dos: DLL ( Dynamic Link Library ) )


▶ 예를 들어 printf() 라는 함수는 Library 에서 경로를 통해 끌어다가 사용한다.

항상 실행될때 쓰이고, 실제로 App에 저장되어있지는 않다. 이렇게 사용되는 것이 "공유 라이브러리" 이다. 

리눅스에서는 공유라이브러리, 윈도우에서는 DLL 이라한다.



 명령어 예제

 ▶ gcc 가 공유 라이브러리를 사용하지 않게 해서 컴파일을 하면 용량이 늘어나는 것을 확인 할 수 있다.



 ▶ -static 을 파일 앞에 붙여 컴파일 

 ▶ size 를 알아보면 얼마만큼 붙었는지 알 수 있다.



환경변수 (getenv, setenv, putenv)

 char * getenv(const char *name)

 : name 에 해당하는 환경변수 값을 넣으면 그 환경변수 경로를 확인 할 수 있을 것이다. 


 ex ) getenv("PATH")

 

 int putenv(char *str)

 : 문자열을 받아서 그대로 환경목록에 넣는다. 이미 존재하는 기존의 정의는 먼저 삭제되고 들어간다.


 ex ) putenv("PATH:/")

 : 다 지워진다 패스가.... 명령어로는 set PATH:/ 하면 다 지워지더라 ..


 int setenv(const char *name, const char *value, int rewrite)

 : 다시 설정해서 적어준다.


 예제

#include <stdlib.h>

#include <stdio.h>

extern char **environ;

int main()
{
  char cBuff[1024];
  char *cp;

  sprintf(cBuff, getenv("PATH"));
  strcat(cBuff, "/home/root");
  setenv("PATH", cBuff, 1);
  printf("PATH=%s\n", getenv("PATH"));
  
    
  return 0;
}

 : PATH 의 경로에 /home/root 가 추가될 것이다. 



setjmp, longjmp 예제 

 ▶ 소스의 흐름을 setjmp 에서 현재 위치를 저장하고, longjmp 를 호출하면 저장했던 위치로 점프한다. 전에 호출됬던 함수들은 스택에서 제거된다.


 int setjmp(jmp_buf env)

 반환값 : 직접 호출된 경우네느 0 , longjmp 를 통해서 호출된 경우에는 0 이 아닌 값


 void longjmp(jmp_buf env, int val)

 : 저장한 위치를 불러올때, val 에 따라 불러오는 위치가 다르겠다.


 

 예제

#include <stdio.h>

#include "apue.h"
#include <setjmp.h>

void One();
void Two();

jmp_buf jmpbuffer;

int main()
{
  if(setjmp(jmpbuffer) == 1)
  {
    printf("---------------------\n");
  }
  else
  {
    printf("Main : Call One\n");
    One();  
    printf("Main : return One\n");
  }

  printf("Main End!\n");
  
  return 0;
}

void One()
{
  printf("One Start!\n");
  Two();
  printf("One End!\n");
}

void Two()
{
  printf("Two Start!\n");
  longjmp(jmpbuffer,1);
  printf("Two End!\n");
}

 출력은 


 Main : Call One

 One Start!

 Two Start!

 -----------------------

 Main End! 


 로 나온다.


저작자표시 (새창열림)

'UNIX 프로그래밍' 카테고리의 다른 글

2013.09.03_정리(수정중)  (0) 2013.09.04
2013.09.04_수정중_  (0) 2013.09.04
2013.09.02_4장 파일과 디렉터리  (0) 2013.09.02
2013.08.30_UNIX_파일I/O_연산 및 함수  (0) 2013.08.30
2013.08.29_UNIX 프로그래밍_3장_파일 I/O  (2) 2013.08.29
    'UNIX 프로그래밍' 카테고리의 다른 글
    • 2013.09.03_정리(수정중)
    • 2013.09.04_수정중_
    • 2013.09.02_4장 파일과 디렉터리
    • 2013.08.30_UNIX_파일I/O_연산 및 함수
    성엽이
    성엽이

    티스토리툴바