'develop'에 해당되는 글 84건

  1. 2007.08.07 c언어 가변 인자 va_list
  2. 2007.07.05 공개 프로젝트 모음
  3. 2007.03.22 [gcc] 라이브러리 오브젝트에 정적으로 링크하기
  4. 2007.01.02 [network] 기본 네트워크 함수 라이브러리
  5. 2007.01.02 리틀 엔디안 & 빅 엔디안
  6. 2007.01.02 MS source safe 사용법
  7. 2006.12.19 mysql 설치 문제
  8. 2006.12.19 mysql 관리용 툴
  9. 2006.12.19 mysql 사용자 추가하기
  10. 2006.12.19 mysql 외부에서 접속하기

c언어 가변 인자 va_list

C언어 가변 인자


printf()와 scanf()와 같은 가변 인자를 받는 함수를 만들거나 이 함수를 덮어 쓰는 wrapper를 만들려면 가변 인자를 처리할 줄 알아야 합니다.

가변 인자를 처리할려면 다음과 같은 data type과 함수 (또는 매크로 함수)를 써야 합니다:

  • va_list -- type
  • va_start(va_list argptr, last-arg) -- 가변 인자 처리 시작.
  • va_end(va_list argptr) -- 가변 인자 처리 끝.
  • T va_arg(va_list argptr, T) -- 가변 인자 얻기.

이들은 모두 표준 헤더 파일인 <stdarg.h>에 선언되어 있습니다. 일단 간단히 N개의 정수(int type)를 받아서 더하는 함수를 만들어 봅시다:

#include <stdarg.h>

int
sum(int nargs, ...)
{
va_list argptr;
int i, total = 0;
va_start(argptr, nargs); /* 가변 인자 처리 시작 */
for (i = 0; i < nargs; i++)
total += va_arg(argptr, int); /* 하나씩 가변 인자 얻기 */
va_end(argptr); /* 가변 인자 처리 끝 */
return total;
}


위와 같이 정의해 놓고 다음과 같이 쓸 수 있습니다 (주의: sum()의 첫번째 인자는 두번째부터 나올 가변 인자의 갯수입니다):

int sum(int nargs, ...);

int
main(void)
{
int s1, s2;
/* 1부터 5까지 더한 값을 s1에 저장. */
s1 = sum(5, 1, 2, 3, 4, 5);
/* 100, 200, 300을 더한 값을 s2에 저장. */
s2 = sum(3, 100, 200, 300);
/* ... */
return 0;
}


일단 가변 인자를 처리하기 위해서는 va_list type의 변수 하나를 선언해야 합니다:

va_list argptr;


그리고, 가변 인자를 처리할 부분 앞에 다음과 같이 써 줍니다:

va_start(argptr, nargs);


va_start()의 첫번째 인자는 아까 선언한 va_list type의 변수 이름이며, 두번째 인자는 이 함수에서 가변 인자를 받는 부분의 바로 앞의 (고정된) argument입니다. 즉, 위에서 예로 든 sum()의 경우, 가변 인자를 나타내는 "..." 앞에 오는 argument인 nargs가 두번째 인자가 됩니다.

눈치가 빠른 분은 이미 알고 있겠지만, 가변 인자를 받는 함수는 여러 가지 제한이 붙습니다. 첫째, va_start()에 가변 인자 바로 앞의 고정된 인자를 주어야 하기 때문에, 가변 인자를 받는 함수는 고정된 인자가 하나 이상 나와야 합니다. 즉, void foo(...)와 같은 함수는 만들 수 없습니다. 둘째, 가변 인자를 나타내는 "..."는 반드시 마지막 인자이어야 합니다. "..."가 중간이나 처음에 나올 수는 없습니다. 예를 들어 void bar(..., int a)와 같은 함수는 만들 수 없습니다.

실제 함수에 전달된 가변 인자를 얻기 위해서는 va_arg()를 불러서 처리합니다. va_arg()는 가변 인자로 전달된 값을 호출할 때마다 하나씩 얻어서 줍니다. va_arg()는 첫번째 인자로, va_start()로 초기화한 va_list type을 받으며, 두번째 인자로는 가변 인자로 전달된 값의 type을 써 주어야 합니다. 우리가 만든 sum()의 경우, 함수의 목적이 모든 int를 더한 값을 계산하는 것이므로, va_arg()의 두번째 인자로 int를 주면 됩니다.

va_arg(argptr, int);


눈치가 더욱 빠른 분이면 아시겠지만, 여기서 가변 인자를 받는 함수에 또다른 제한이 붙습니다. 아시겠지만, 가변 인자로 전달되는 값의 타입에는 제한이 없습니다 (printf(), scanf()를 생각해보세요). 아쉽게도 va_arg()는 전달되는 값의 타입을 알아낼 방법이 없습니다. 따라서 미리 그 type을 알아서 va_arg()의 두번째 인자로 전달해 주어야 합니다.

게다가, 가변 인자를 받는 함수의 입장에서, 몇개의 가변 인자가 전달되었는지 알아낼 방법은 없습니다. 따라서 고정된 인자로 가변 인자의 갯수를 전달하는 등 (위의 sum()의 예처럼)의 방법으로 va_arg()를 몇번을 불러야 되는가를 알아낼 방법을 제공해야 합니다.

더 골치 아픈 것은 va_arg()의 두번째 인자로 쓸 수 있는 type에 제한이 있다는 것입니다. 이건 뒤에서 다루겠습니다.

이제 가변 인자를 처리하는 함수를 만들어 보았으니, printf()의 wrapper를 만들어 봅시다.

노파심에서 말씀드리지만, 다음과 같은 함수는 동작하지 않습니다:

int
my_printf(const char *fmt, ...)
{
return printf(fmt, ...);
}


일단 먼저, printf의 계열에는 다음과 같은 함수들이 있다는 것을 알아둡시다:

int printf(const char *fmt, ...);
int fprintf(FILE fp, const char *fmt, ...);
int sprintf(char *sr, const char *fmt, ...);
int snprintf(char *s, size_t n, const char *fmt, ...);
/* 이상 <stdio.h>에 선언되어 있는 함수들 */
int vprintf(const char *fmt, va_list ap);
int vfprintf(FILE fp, const char *fmt, va_list ap);
int vsprintf(char *sr, const char *fmt, va_list ap);
int vsnprintf(char *s, size_t n, const char *fmt, va_list ap);
/* 이상 <stdarg.h>에 선언되어 있는 함수들 */


잘 보면 알겠지만, <stdarg.h>에 있는 함수들은 <stdio.h>에 있는 printf() 계열 함수 이름 앞에 'v'가 붙고, "..." 대신에 va_list type의 인자가 온다는 것을 알 수 있습니다.

printf() style의 문자열을 받으려면, 이 v*printf() 계열의 함수를 쓰면 편리합니다. 예를 들어 단순히 printf()와 똑같은 기능을 하는 wrapper는 다음과 같이 만들 수 있습니다:

int
my_printf(const char *fmt, ...)
{
va_list argptr;
int ret;
va_start(argptr, fmt);
ret = vprintf(fmt, argptr);
va_end(argptr);
return ret;
}


즉, 가변 인자 처리를 위한 va_list type 변수를 선언, va_start()로 초기화한 다음에 v*printf() 계열의 함수에 이 va_list type의 변수를 넘겨주기만 하면 됩니다. (va_end()를 불러 끝내는 것을 잊지 마세요!!)

좀더 복잡하게 하나 더 만들어 봅시다. 함수는 error()입니다. 이 함수는 주어진 printf() style의 에러 메시지를 받아서 stderr로 출력하고, 필요하면 errno의 내용도 알려주고, 필요하면 exit()를 불러서 프로그램을 종료하는 함수입니다. 선언은 다음과 같습니다:

void error(int status, int ecode,
const char *fmt, ...);


이 함수는 ecode가 0이 아닌 경우, strerror(ecode) 값을 출력하고, fmt와 "..."으로 전달된 printf() style의 에러 메시지도 출력한 다음, status가 0이 아닌 경우, exit(status)를 호출합니다. 함수 정의는 다음과 같습니다.

void
error(int status, int ecode,
const char *fmt, ...)
{
va_list argptr;
fflush(stdout);
fprintf(stderr, "error: ");
if (ecode)
fprintf(stderr, "%s: ", strerror(ecode));
va_start(argptr, fmt);
vfprintf(stderr, fmt, argptr);
va_end(argptr);
fputc('\n', stderr);
fflush(stderr); /* redundant */
if (status)
exit(status);
}


다음과 같이 쓸 수 있습니다.

#include <stdio.h>
#include <errno.h>
...
void
foo(const char *filename)
{
FILE *fp;
fp = fopen(filename, "r");
if (!fp)
error(1, errno, "cannot open file %s.", filename);
...
}


참고로 여기서 예로 만든 error()는 GNU C library (glibc)에 이미 포함되어 있습니다. 여기에서는 좀더 간략화해서 만들어 본 것이죠. 실제 여러분의 코드에 <error.h>를 포함시키면 위 error()를 정의할 필요없이 바로 쓸 수 있습니다. (출력 형태는 약간 다를 수 있습니다만, 인자 type이나 갯수는 같으니 똑같이 쓸 수 있습니다)

마지막으로 아까 va_arg()의 두번째 인자로 나올 수 있는 type에 제한이 있다고 했는데 그 얘기를 해보겠습니다. 결론부터 말하면, va_arg()의 두번째 인자로 나올 수 있는 type은 다음과 같습니다:

  • int 계열 (int, unsigned int, signed int)
  • long 계열 (long, unsigned long, signed long)
  • double 계열 (double, long double)
  • 포인터 계열 (모든 타입의 포인터, 예를 들어 void *, char *, 등등)

다음과 같은 타입은 올 수 없습니다:

  • char 계열 (char, unsigned char, signed char)
  • short 계열 (short, unsigned short, signed short)
  • float 계열 (float)

그럼 가변 인자로 char나 float type은 올 수 없느냐, 그렇지는 않습니다. 이런 타입을 받기 위해서는, va_arg()에 다음과 같이 전달합니다.

  • char -> int (unsigned char는 unsigned int, 이런 식으로)
  • short -> int (unsigned short는 unsigned short, 이런 식으로)
  • float -> double

그 이유는 다음과 같습니다. C 언어가 처음 만들어질 때에는 function prototype이란게 없었습니다. 인자가 몇개이고, 어떤 타입이냐에 상관없이 단순히 함수가 있고, 리턴 타입이 뭐다. 정도만 알려 줬죠. 예를 들면 다음과 같습니다:

double bar();

double bar(a, f, ch)
int a;
float f;
char ch;
{
...
}


이런 식으로 함수를 선언하게 되면, 컴파일러가 함수의 정의를 보기 전에는 이 함수에 전달되는 인자의 타입이 뭔지 알 수 없습니다. 만약 컴파일러가 bar()의 정의를 보기 전에 다음과 같은 코드를 컴파일해야 한다고 가정해 보기 바랍니다:

void
foo(void)
{
bar(4, 2.5, 9);
}


일단 bar()의 인자가 3개인데,, "void bar();"만 보고서는 인자가 적절하게 전달되었는지 알 방법이 없습니다. 따라서 인자 갯수 체크를 할 수 없습니다.

둘째로, 각각의 인자가 알맞는 타입인지도 알 수 없습니다. 함수 호출을 위해서는 (stack에 인자를 push해야 하는데), 인자의 type을 알 수 없으니, 첫번째 인자인 4를 push할 때, 8 bit로 4를 push할 것인지, 16 bit로 4를 push할 것인지, 32 bit로 할 것인지 알 수가 없습니다.

따라서 C 언어에는 "integral promotion"이란 용어? 개념?이 있고, 여기에 따라서 모든 인자는 다음과 같은 type으로 변환해서 stack에 push합니다.

  • char, short -> int
  • float -> double
  • int -> int (그대로)
  • long -> long (그대로)
  • double -> double (그대로)
  • long double -> long double (그대로)
  • 모든 pointer type -> 모든 pointer type (그대로)

즉, 인자로 전달된 값이 character 값이라 할 지라도 함수를 호출할 때에는 int type으로 변환해서 전달합니다.

지금까지는 ANSI C에서 function prototype이 나오기 전의 old style (K&R) C에 필요한 내용입니다. 자, ANSI C에서는 function prototype이 있으니, 컴파일러가 함수 호출을 하기 전에 함수의 인자 갯수와 타입을 모두 알 수 있습니다.

double bar(int a, float f, char ch);


따라서 더 이상 이러한 변환이 필요없게 되었지만, 하나 예외가 있는데, 바로 가변 인자를 처리하는 함수입니다. 가변 인자는 실제로 어떠한 타입이 몇개가 들어올 지 알 수 없기 때문에, 이러한 변환이 계속 수행됩니다. 따라서 va_arg()로 이러한 타입을 받을려면 이 integral conversion을 미리 생각해 두어야 합니다.

예를 들어 문자 하나씩 받아서 출력하는 함수를 만들어 보겠습니다:

void
putchars(int nargs, ...)
{
va_list argptr;
char ch;
int i;
va_starg(argptr, nargs);
for (i = 0; i < nargs; i++) {
ch = (char) va_arg(argptr, int);
putchar(ch);
}
va_end(argptr);
}


즉, 들어올 가변 인자가 char type일지라도 va_arg()에서는 integral promotion에 따라 int type으로 받아서 처리해야 합니다.

잘 생각해 보면, 이미 여기에 대해 알고 있었을 것입니다. printf()와 scanf()를 생각해봅시다.

printf에서 float이나 double을 출력하기 위해서는 "%f"를 씁니다. 그런데, scanf에서는 float은 "%f", double은 "%lf"를 씁니다. 아래 예 참고:

double d;
float f;
printf("%f", d);
printf("%f", f);
scanf("%f", &f);
scanf("%lf", &d);


그 이유는, integral promotino에 의해 printf의 경우, float을 double로 받기 때문입니다. 따라서 float과 double에 관한 차이가 없습니다. 그러나 scanf의 경우에는 모든 인자가 pointer type이기 때문에 이러한 변환이 필요없습니다. 즉, 모든 타입을 각각 구별해야 하는 것이죠.

분명 printf 코드안에서 float을 출력하는 부분은 다음과 같은 코드를 포함합니다:

  value = (float) va_arg(argptr, double);


또한 scanf 코드 안에서 float을 출력하는 부분은 다음과 같은 코드를 포함합니다:

  ptr = va_arg(argptr, float *);


이 정도면 가변 인자를 처리하는 방법은 완벽히! 익히셨을 것입니다. 그럼 다음 기회에...

끝 -- cinsk



  • TODO: Function prototype이 ANSI C에서 소개된 것 맞나?
  • TODO: Integral Promotion이라고 했는데, 여기에 float, double이 포함되는 것이 확실한가?
이거 알아보고 글 고칠 것.. -- cinsk.

함수 선언(정의가 아닌)의 경우에는 그 전에도 있었던 것 같습니다. [http]http://www.ifi.uio.no/forskning/grupper/dsb/Programvare/Xite/ProgrammersManual/node11.html#SECTION000111000000000000000 그러나 매개변수의 타입들을 함께 적어주는 function prototype은 ANSI C에서 새로이 나온 것인 듯 합니다.

가변인자 함수에서 적용되는 것은 Integral Promotion을 포함하는 Default argumnt promotion입니다.

C99 6.5.2.2 Function calls 중에서...

If the expression that denotes the called function has a type that does not include a prototype, the integer promotions are performed on each argument, and arguments that have type float are promoted to double. These are called the default argument promotions.

그리고 표준문서에서는 Integer promotion이라는 용어를 씁니다.

Integer promotion은 이름 그대로 정수형의 승급만을 의미합니다. double이나 포인터는 포함되지 않습니다. int형 또는 unsigned int형보다 rank가 낮은 (즉 표현범위가 좁은) 정수형에 한해서 int 형 또는 unsigned 형으로 승급됩니다. 해당되지 않는 데이터 형들은 그대로 남습니다.

6.3.1.1 Boolean, characters, and integers 중에서...

The following may be used in an expression wherever an int or unsigned int may be used:

  • An object or expression with an integer type whose integer conversion rank is less than the rank of int and unsigned int.
  • A bit-field of type _Bool, int, signed int, or unsigned int.

If an int can represent all values of the original type, the value is converted to an int; otherwise, it is converted to an unsigned int. These are called the integer promotions. All other types are unchanged by the integer promotions.



가변 인자 매크로


ISO C 표준을 지원하는 컴파일러에서는 가변 인자를 처리하는 매크로도 정의할 수 있습니다. 함수 형태의 매크로를 정의할 때, "..."을 써 주고, 매크로 정의 부분에서 VA_ARGS를 써주면 그 자리에 확장됩니다. 예를 들면, 다음과 같습니다:

#define debug(s, ...)    fprintf(stderr, s, __VA_ARGS__)

void
foo(void)
{
debug("Entered the function, %s\n", __func__);
/* ... */
}


간단하게 printf 형태의 메시지를 입력받은 표준 함수 assert()와 비슷한 매크로 함수를 만들어 봅시다; 함수 이름은 ASSERT()로 하겠습니다. ASSERT()의 첫 인자는, assert()의 인자와 같습니다. 즉 거짓인 경우, abort()를 부릅니다. ASSERT()의 두번째 인자부터는 printf()와 같습니다. 또한 NDEBUG 매크로가 정의된 경우, ASSERT()는 아무런 영향을 주지 않습니다.

일단, ASSERT()가 쓰인 시점의 파일 이름, 줄 번호, 그리고 함수 이름을 자동으로 출력하게 합시다. 따라서 미리 정의된 매크로인 FILELINE을 쓰며, 미리 정의된 이름, func를 씁니다.

아래에 ASSERT()의 정의가 나갑니다:

#ifndef NDEBUG
# define ASSERT(exp, s, ...) assert_(__FILE__, __LINE__, __func__, \
#exp, s, __VA_ARGS__)
#else
# define ASSERT(exp, s, ...) ((void)0)
#endif /* NDEBUG */


간단합니다. NDEBUG가 정의된 경우에는 ASSERT()가 assert_()를 호출합니다. assert_()의 처음 세 인자는 ASSERT()를 부른 곳의 파일 이름, 줄 번호, 함수 이름을 자동으로 전달하게 됩니다. 다음으로 ASSERT()의 첫 인자를 문자열로 바꾸어 전달하며(#exp), 그 다음으로, printf() 스타일의 format string인 s가 들어오며, 그 뒤에 가변 인자가 들어옵니다.

이제 assert_()의 정의가 나갑니다:

#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
void
assert_(const char *filename, int lineno, const char *func,
const char *exp, const char *fmt, ...)
{
va_list argptr;
fflush(stdout);
fprintf(stderr, "%s:%d: assertion, (%s) failed in function, %s\n",
filename, lineno, exp, func);
fprintf(stderr, "\treason: ");
va_start(argptr, fmt);
vfprintf(stderr, fmt, argptr);
va_end(argptr);
putc('\n', stderr);
abort();
}


예를 들어 다음 함수를 생각해 봅시다:
void
set_age(int age)
{
ASSERT(age > MIN_AGE, "age should be larger than %d.", MIN_AGE);
/* ... */
}
MIN_AGE는 10으로 정의된 매크로이고, 사용자가 set_age(3)을 호출했다면, 다음과 같은 ASSERTion이 발생합니다:

tmp.c:36: assertion, (age > minimum) failed in function, set_age
reason: age should be larger than 10.
Aborted


자, 그럭 저럭 ASSERT() 쓸만하죠? assert()보다는 좀 나을 것 같습니다.

참고: ISO C 표준 6.4.2.2, 6.10.3

공개 프로젝트 모음

1 win32기반의 gcc관련 툴 #

  • Cygwin - Win32에서 GNU 관련 개발툴과 유틸리티를 사용할 수 있게 만들어주는 cygwin에 대한 내용.
  • MinGW - gcc로 win32 어플리케이션을 만들수 있게 해주는 공식 배포본.
  • unxutils 이야기 - Karl M. Syring이란 사람이 관리하는 오픈소스 프로젝트입니다. UNIX나 리눅스에서 흔히 사용하는 명령들을 윈도우즈로 옮겨놓았습니다. 인스톨러 형태의 배포본도 있네요.
  • GNU patch 간략사용법 - 웹에서 퍼왔습니다. patch 화일 만들기 및 적용방법 요약.

2 openoffice #

3 인스톨러 제작툴 #

  • [http]NSIS 2 - Winamp로 유명한 널 소프트에서 만든 인스톨러 저작툴입니다. 약간 쓰기 어렵지만, 공개라는 점과 스크립팅 시스템이 거의 상용수준이라는 점이 장점이죠.
    • [http]http://hmne.sourceforge.net/ - 전용 에디터입니다. 간단한 인스톨 스크립트를 만들어주는 위저드 기능 포함. 물론 공개. 델파이로 만들었네요.

4 FTP 관련 #

5 문서 저작툴 #

  • Tex - 유명한 조판 언어 tex에 대한 자료.

6 그래프 문서 저작툴 #

  • Graphviz - AT&T사에서 만든 dot이라는 알고리즘을 구현한 그래프 시각화 툴입니다. 간단히 말하면 '순서도'나 '구조도'를 생성해주는 툴이죠.
  • [http]http://www.ideagraph.net - 아이디어를 visual 맵으로 저장해주는 툴. 자바로 제작.
  • Dia 이야기 - visio 공개판이라 할 수 있는 툴. 그래프 기반의 문서작성 툴. GTK+로 제작.
  • [http]http://www.gnuplot.info/ - 꽤 오래된 그래프 드로잉 툴. 원래 과학계산용 공식 그래프를 그려주는 툴인데, 간단한 높이필드나 경로체크용 그래프, 산포도등의 용도로 사용해도 좋습니다. 설치도 쉽고 사용하기도 편리합니다.

6.1 프로젝트 일정관리 #

  • [http]http://ganttproject.sourceforge.net - gantt 차트 저작툴. visio외 다른 툴보다도 훨씬 좋고 심플하다. java 1.4이상 요구. 현재 한글깨지는거 해결된 상태

7 프로그래밍 Helper 툴 #

  • doxygen 이야기 - Doxygen에 대한 내용을 다룹니다. 메뉴얼 번역 및 설치법등등.
  • CVS - 버전 관리 및 프로젝트 소스 관리시스템인 CVS에 대한 내용입니다.
    • [http]http://subversion.tigris.org/ - subversion이라는 CVS를 개선한 버전관리 시스템입니다. 아파치 서버를 기반 서버로 사용하는 것과 파이선을 이용하는 것이 특징입니다. 아무래도 cvsnt보다는 무거운듯... 대규모 프로젝트에는 괜찮을 거 같다는 생각이 듭니다. tortoisesvn이라는 tortoisecvs 클론이 개발되고 있네요. :)
  • [http]http://webcpp.sourceforge.net/ - 여러가지 언어의 프로그램소스를 syntex highlight처리된 html화일로 바꿔주는 프로그램.
  • autoconf 이야기 - makefile을 자동으로 생성해주는 gnu 툴.
  • jam 이야기 - perforce사에서 만든 make 대체 툴. C++작업에 유용. boost 라이브러리에 채용.

8 콜백 관리 #

  • 콜백 시스템으로는 크게 시그널-슬롯방식과 메세징 방식이 사용되고 있는데, 주로 GUI라이브러리의 처리에 이용되고 있습니다. MS 윈도우즈는 전통적으로 메세징을 선호하고 있지만, GTK와 Qt와 같은 공개진영과 관련된 곳에서는 시그널-슬롯방식이 많이 사용되는 것 같습니다. 양쪽다 장단점이 있긴하지만... 시그널-슬롯 방식은 국내에는 잘 알려져있지 않을 것 같네요.
  • [http]http://libsigc.sourceforge.net - libsigc++ 이라는 GTK++에 채용된 C++ typesafe 콜백 라이브러리입니다. 보통 boost::signals와 비교되지만... boost의 것은 jam이라는 비make기반의 빌드툴을 사용해야만해서 좀 거부감이....:)
    • sigcpp이야기 - libsigc++에 관한 내용을 정리해둔 것입니다.

9 네트워크 #

  • [http]netcat - TCP/UDP 패킷 분석 Helper 툴. 간이 서버 및 클라이언트 테스트 용도로도 사용가능. 간단한 RPC툴로도 사용가능합니다! 배포본안에 포함된 실행화일에 트로이목마 바이러스가 걸려있습니다! 압축푸시고 실행화일을 지우신 후 새로 컴파일하시는 것이 좋습니다.
    • netcat 이야기 - readme화일 번역. 자작 mingw용 makefile과 win32용 빌드 실행화일도 있습니다. :)
    • [http]http://www.atstake.com/research/ - @Stake라는 회사인데 네트워크 전문 연구소를 소유하고 있음. 위 툴은 hobbit와 chris라는 이 회사 연구원이 개발.
    • [http]http://farm9.org/Cryptcat/ - netcat에 twofish2 암호화 알고리즘을 붙였네요. 오픈소스. 소스에 twofish2 소스 포함되어있는데 꽤 깔끔합니다.
  • MRTG 이야기 - multi router traffic grapher. 트래픽 및 기타 정보에 대한 통계 그래프를 웹으로 출력해주는 툴. perl로 작성되어있다. 꽤 잘알려진 오픈소스 프로젝트.
  • Ethereal 이야기 - 오픈소스 네트워크 분석기. 일명 스니핑 툴이라고 하는데, 패킷을 가로채서 덤프하는 툴이죠. 보통 상용을 쓰는데, 이것도 꽤 괜찮은 툴입니다. 윈도우즈에서는 GUI가 좀 쓰기 그렇다는 단점은 있군요.
  • STunnel 이야기 - 공개 SSL 프록시 서버 데몬입니다. 간단히 말하면 SSL을 지원하지 않는 서버를 SSL을 지원하도록 하는데 사용합니다.
  • Snort 이야기 - 공개 IDS 툴(외부로부터 해킹과 같은 침입이 발생했을때 진단하고 알려주는 툴)중에서 유명한 것입니다. 버전업되면서 거의 상용수준의 성능을 자랑합니다.
  • [http]fragroute - IDC 테스팅 툴.
  • [http]http://pvpgn.berlios.de/index.php - 블리자드 베틀넷을 공개로 다시 구현한것. 오픈소스. :)

10 압축 #

  • [http]http://www.info-zip.org - 오래전에 개발된 명령행 zip압축해제툴. zip, unzip과 같이 압축/해제를 별도의 프로젝트로 관리중. 비압축 zip화일을 만들수 있다는 특징이 있음. 오픈소스.
  • zlib 이야기 - 유명한 공개 압축라이브러리인 zlib입니다. MS도 자사제품일부에 사용했다고 하죠.
  • [http]http://zziplib.sourceforge.net/ - zZIPlib. zlib를 다소 사용하기 쉽게 정리한 라이브러리. 내장?디렉토리에 따라 화일을 열고 읽을 수 있도록 한것이 특징.
    • mingw에서 컴파일 : 빌드 안됨. mmap 부분에 문제가 있는듯...
  • [http]http://www.eskimo.com/~scottlu/win/ - zlib기반의 실행화일 압축 프로그램. 오픈소스.
  • [http]http://www.oberhumer.com/opensource/lzo/ - upx 개발자가 만든 압축 라이브러리. 무손실, 상당히 빠른 압축해제속도, 압축풀때 메모리를 사용안함. ANSI C 기반인점 등등 장점이 많은 라이브러리.
  • [http]http://upx.sourceforge.net/ "the Ultimate Packer for eXecutables"의 약자. 실행화일을 압축해서 상당히 작은 크기로 만들어주는 오픈소스 툴. 압축률이 상당히 좋다. 소스는 공개되어있지만 상업적으로 이용하려면 원저자와 협의필요.
    • 팁 : msys에서 사용하려면 32비트 DOS버전을 설치해야만 합니다. 다른 것은 다운되더군요.

11 라이브러리 #

  • [http]http://cal3d.sourceforge.net/index.html - Cal3D. 공개 오픈소스 캐릭터 에니메이션 라이브러리.
  • freeimage 이야기 - C 기반의 이미지 라이브러리입니다. 처음 개발자가 개발을 그만두었지만 현재도 개발이 진행중인 라이브러리.
  • SQLite - SQL92 표준을 따르면서 Metakit의 장점을 모두 가지고 있는 DB 라이브러리.
  • [http]http://www.icculus.org/physfs/ - 퀘이크 WAD화일처럼 화일 한개내에 여러개의 화일을 담아두고 억세스하도록 해주는 라이브러리.
  • Makeheaders 이야기 - C/C++ 소스를 모아 헤더화일을 생성해주는 툴. 대규모 프로젝트를 수행할 때 편리함.
  • LEMON 파서생성기 이야기 - bison이나 yacc과 같은 역할을 하지만 간단하고 상당히 가벼운 파서생성기.
  • OTL - OTL (Oracle/ODBC Template Library) 공식 홈페이지.
  • [http]http://dtemplatelib.sourceforge.net - DTL (Database Template Library) 공식 홈페이지. ODBC 필요.
  • [http]http://www.unixodbc.org/ - unixODBC 공식 홈페이지.
  • [http]http://zeoslib.sourceforge.net/ - ZEOS 라이브러리 공식 홈페이지. 오픈소스 DB 연결에 사용. C빌더/델파이용.
  • [http]http://www.vorbis.com Ogg Vorbis. 오픈소스 사운드 압축화일 포맷 및 그에 따른 지원 라이브러리 프로젝트.
  • [http]http://www.speex.org/ - Ogg와 호환되는 Vorbis 대체용 코덱. vorbis보다 2~4배더 압축효율이 좋다고 한다. 대신 패턴에 따른 손실이 크며 주로 음성코덱용으로 사용.
  • [http]http://www.portaudio.com/ - 다중 플렛폼 오디오 입출력 라이브러리. 오픈소스.
  • [http]http://synedit.sourceforge.net/ - 공개인 syntax highlighting 가능한 메모 VCL 콘트롤.
  • [http]http://libsigc.sourceforge.net/ - signal+slot방식의 콜백시스템을 아주 쉽게 구현하게 해주는 C++기반의 템플릿 라이브러리. qt나 gtk+등등을 써보신 분은 이러한 이벤트 전달방식에 괜찮다는 생각을 하실 수 있을 듯. 현재 버전 2.0 발표.
  • iconv - 각종 로케일 및 코드변환 라이브러리. 예를 들면 UTF-8 -> 조합형 또는 완성형 처리를 실행해주는 라이브러리입니다. GNU 재단에서 관리하네요.
  • curl 이야기 - HTTP, FTP등등의 잘알려진 프로토콜을 사용하여 화일을 송수신할 수 있도록 하는 유명한 라이브러리입니다.
  • [http]http://www.ginac.de/CLN/ - 큰 상수 및 실수 연산 라이브러리. C++로 되어있습니다.
  • [http]http://www.geocities.com/axilmar/libgc/libgc.htm - 어떤 사람이 만든 C++ 개비지 컬렉터. 나름대로 정리한 듯. gc되어야하는 객체를 특정 클래스로부터 상속받아야만 하는 것이 단점.
  • [http]http://conio.sourceforge.net/ - 볼랜드 터보C 스타일의 콘솔 입출력 라이브러리. 간단히 말해 명령 프롬프트상에서 커서이동 및 문자열 색상 변경등을 단순화시킨 것. :)
  • [http]http://softwire.sourceforge.net/ - 실시간 임베딩 x86용 어셈블러 라이브러리. C++로 작성되어있으며 특정 상황에 상당히 유용할거라 생각됩니다.
  • [http]http://www.cs.man.ac.uk/aig/staff/alan/software/ - 2D 폴리곤 clipping 연산 라이브러리. GPL.

11.1 자료구조 #

  • [http]http://users.footprints.net/~kaz/kazlib.html - 몇몇 리스트, 해쉬트리등등을 구현한 C 라이브러리. C++을 사용할 수 없는 경우(STL을 사용할 수 없는 경우) 유용할 거라 생각합니다.

12 보안 및 암호화 #

12.1 라이브러리 #

12.2 PGP #

PGP 참조

13 에디터 #

  • scite - 최강의 초경량, 다기능 텍스트 에디터. 강추입니다!
  • vim 이야기 - vim/cream에 대한 내용입니다.
  • [http]http://www.jedit.org/ - 자바로 만든 오픈소스 플러그인방식의 에디터. 상당히 기능이 다양하며 뭐니뭐니해도 플렛폼 독립적이라는게 장점. 한글인코딩지원 및 문법 하이라이팅을 XML을 통하여 쉽게 고칠수 있다는 점이 장점.
  • [http]http://www.eclipse.org/ - 자바로 만든 통합 IDE. 다소 느리지만 J빌더 수준은 나온다는 소문이...

13.1 diff 툴 #

  • [http]http://winmerge.sourceforge.net/ - 상당히 쓸만한 diff 및 merge 프로그램. tortoisecvs와 연동도 가능. 정식보다는 가급적 최신 베타 버전을 받는 것이 좋습니다. 메뉴 한글화됨.

14 기타 툴 #

15 게임 제작 관련 라이브러리 #

  • [http]http://plib.sourceforge.net/ - PLib. 여러가지 이식가능한 게임제작관련된 라이브러리의 모음. 네트워크 라이브러리 참고할만함.
  • [http]http://www.ploksoftware.org - ExNihilo라는 오픈소스 3D 엔진을 제공하고 있음.
  • [http]http://clanlib.org/ clanlib 게임 라이브러리. 출력, 입력, 사운드, 네트워크 통합 지원. 이 라이브러리를 사용한 공개게임들의 품질이 괜찮다.
  • [http]http://alleg.sourceforge.net/ - allegro. DOS시절부터 발전되어온 게임 제작용 라이브러리. 출력만을 지원.
  • [http]http://irrlicht.sourceforge.net/ 우연히 발견한 오픈소스 3D 엔진. 성능 및 기능은 모르겠지만, DX와 GL의 통합 계층부분은 쓸만하다.
  • [http]http://arianne.sourceforge.net/ - 온라인 게임 프레임워크. 자체 서버 프레임워크도 가지고 있음.

16 사운드 #

17 XML #

17.1 XML-RPC #

XML-RPC 참조


 

18 화일 공유 #

19 그룹웨어 & 스케줄링 #

  • [http]http://www.phprojekt.com/ - php + DB 기반의 오픈소스 그룹웨어. 한글이 잘된다. gantt 차트도 그냥 HTML table로 만든 것이 특이.
  • [http]http://www.k5n.us/webcalendar.php - 간단한 보안기능을 가진 웹 달력. 간이 스케줄러로서 유용. 일부 한글화.
  • [http]http://www.planscalendar.com - 간단한 웹기반 달력시스템. 수정시 암호지정가능. 호스팅 계정에도 설치가 가능하다.

20 마인드매핑 #

21 정규표현식 #

22 파서/스캐너 #

22.1 spirit #

  • [http]http://spirit.sourceforge.net - C++내에 inline방식으로 LL 파서를 내장시켜주는 템플릿 라이브러리. 쓰레드안전기능추가를 위해서는 boost.threads, 정규표현식 파서기능을 쓰려면 boost.regex 필요.

22.2 lex/yacc #

23 악세사리 #

  • [http]http://surf.to/neko/ - 윈도우즈용 neko. 화면뛰어다니는 고양이를 표시해주는 "고루한" 악세사리인데, 소스가 공개되어있다. :)

24 포럼 #

  • minibb 이야기 - ACE 포럼을 만드는데 사용한 포럼툴입니다. 간단하고 고치기쉬운것이 장점.

25 머드 #

  • 좀 고전적이지만 기획적인 측면에서 참조할게 있더군요. 공개이고 괜찮은 사이트 링크합니다.
  • [http]http://www.awemud.net - 텔넷기반의 MUD서버제작 사이트. scriptix라고 하는 자체 스크립트 언어도 개발중이다. 모두 오픈소스 공개.

26 번역 툴 #

  • [http]http://www.poedit.org - poedit. gettext를 실행하려면 po화일을 우선 작성해야하는데 이를 작성하기 쉽게 해주는 프로그램. 한글화 되어있음.
  • [http]http://translation.gnu.or.kr/helping/gettext/ - gettext 번역방법. 간혹 몇몇 공개 어플리케이션은 gettext를 사용하여 국제화를 처리하고 있습니다.

27 텔넷 클라이언트 #

  • [http]http://kldp.net/projects/iputty/ - putty라는 오픈소스 공개 텔넷 클라이언트가 있는데, 이를 한글화한 것입니다. 오른쪽에 있는 다운로드 탭을 선택해서 다운받으면 됩니다.

28 email 알림 #

29 트루타입 저작툴 #

30 벡터기반 그리기도구 #

30.1 스포이드 툴 #

30.2 Hex 에디터 #

31 그래픽 화일 제어 #

32 웹 에디터 #

  • [http]http://www.fckeditor.net/ - 웹상에서 간단한 문서에디팅을 예쁘게 지원하는 프로그램. IE, 모질라 계열 모두 지원. 오픈소스. 꽤 좋다. :)

33 웹 서버 #

  • [http]http://www.lighttpd.net/ - 아파치보다 빠르다는 벤치마크 결과를 게시하고 있네요. php가능. UNIX계열 only.
  • [http]http://dmr.ath.cx/net/darkhttpd/ - 단일쓰레드기반에 HTTP 1.1을 지원하는 웹서버 데몬. UNIX계열 운영체계에서 사용가능하다. CGI지원안함. 오픈소스. BSD 라이센스.
  • [http]http://www.yhttpd.org - 이식가능하고 가벼운 오픈소스 웹서버. ychat이라는 채팅서버도 같이 개발중.

34 irc 서버 #

35 time서버 동기화 클라이언트 #

  • [http]http://nettime.sourceforge.net/ - 공개 win32 time 서버 클라이언트. 간단히 말해 PC 시간을 자동으로 정확하게 맞춰준다. 우리나라는 한국표준과학연구원 타임서버 time.kriss.re.kr 로 설정하는 것이 좋다.

36 webcam #

37 괜찮은 공개프로그램(오픈소스아님) #

  • [http]http://www.teamcti.com/trayit/trayit.htm - 모든 프로그램을 tray로 집어넣어주는 win32용 프로그램. 프로그램 여러개 띄워놓고 사용하는 사람들에게 꽤 쓸만한 툴.
  • [http]http://free-backup-software.net/ - justzipit이라는 압축 툴 제공. 알집도 좋지만, 가볍고 쓰기좋은 점에서는 이것도 좋은 듯. 속도도 빠르다.
  • [http]http://www.freedownloadmanager.org/ - flashget과 같은 공개 다중 다운로드관리자. 여러화일을 다중쓰레드로 빨리 다운받을때 유용하죠. 팝업광고도 안뜨는 아주 괜찮은 툴입니다. :)
  • [http]http://openproject.nazzim.net/ - 국산 캡쳐 프로그램. 심플하고 있을건 다있다.


38 괜찮은 상용프로그램 #

38.1 sshd 서버 #

[gcc] 라이브러리 오브젝트에 정적으로 링크하기

gcc 옵션 "-static"을 사용하면, 비록 라이브러리가 없는 환경에서 실행한다고 해도 공유라이브러리 에러가 나지 않는다.

'develop' 카테고리의 다른 글

c언어 가변 인자 va_list  (0) 2007.08.07
공개 프로젝트 모음  (0) 2007.07.05
[network] 기본 네트워크 함수 라이브러리  (0) 2007.01.02
리틀 엔디안 & 빅 엔디안  (0) 2007.01.02
MS source safe 사용법  (0) 2007.01.02

[network] 기본 네트워크 함수 라이브러리

[listen]
int listen(int socket_fd/**<소켓의 파일 디스크립터*/, int queue_size/**<연결요청 대기 큐의 크기 지정*/);
@brief   :    서버가 "연결 요청 대기 상태"로 들어갈 수 있게 도와준다.
                (=> 서버가 대기 상태로 들어가야지만, 클라이언트가 connect를 해도 에러가 생기지 않는다.)
@return :    성공시 0, 실패 시 -1

[accept]
int accept(int socket_fd/**<서버 소켓의 파일 디스크립터*/,
               struct sockaddr *addr/**<클라이언트의 주소정보를 저장할 변수의 포인터*/,
               int *addrlen/**<addr 포인터가 가리키는 구조체의 크기를 저장하고 있는 변수의 포인터*/);
@brief    :   연결 요청 대기 큐에 대기 중인 클라이언트의 연결 요청을 수락하는 함수
@return  :   성공 시 새로운 소켓의 파일 디스크립터, 실패 시 : -1



'develop' 카테고리의 다른 글

c언어 가변 인자 va_list  (0) 2007.08.07
공개 프로젝트 모음  (0) 2007.07.05
[gcc] 라이브러리 오브젝트에 정적으로 링크하기  (0) 2007.03.22
리틀 엔디안 & 빅 엔디안  (0) 2007.01.02
MS source safe 사용법  (0) 2007.01.02

리틀 엔디안 & 빅 엔디안

 
엔디안

모든 플랫폼(유닉스, 리눅스, 윈도우)에서 공통적으로 binary파일을 읽고 쓰고 하고 싶습니다.
즉, double, int, char 등으로 이루어진 binary 파일을 여러가지 플랫폼에서 작성하고
그 파일을 window에서 읽을 수 있게 하고 싶습니다.

그런데 리틀엔디안, 빅엔디안 이란 것때문에 그게 쉽지만은 않은 작업같더군요.


1) 각 시스템에 해당 시스템이 어떤 엔디안인지 알 수 있는 API함수같은 것이 있는지요?

2) 제가 간단히 테스트해본 바로는 int나 캐릭터는 리틀엔디안/빅엔디안의 영향을 받지만 double은 상관없는 것 같더군요.
(자신은 없습니다. -_-; 한달쯤 전에 아주 간단히만 체크해본 거라서.)
어떤 데이터 타입이 리틀/빅엔디안의 영향을 받는 지 알 수 있을까요?

3) 제가 생각하는 것은 예를 들어 무조건 '리틀엔디안'으로만 파일에 쓰이도록 하는 방식을 생각하고 있습니다.
혹시 더 좋은 방법이 있을런지요?


4) 더불어 예전에 올렸던 질문글에서 한 분이 다음과 같은 방식을 알려주시더군요. 다음 매크로를 쓰려고 합니다.
코드:
#if LITTLE_ENDIAN
#    define Swap32LE(x) (x)
#    define Swap32BE(x) ((((x) & 0xff000000) >> 24) | (((x) & 0xff0000) >> 8) | (((x) & 0xff00) << 8) | (((x) & 0xff) << 24))
#else
#    define Swap32LE(x) ((((x) & 0xff000000) >> 24) | (((x) & 0xff0000) >> 8) | (((x) & 0xff00) << 8) | (((x) & 0xff) << 24))
#    define Swap32BE(x) (x)
#endif

 
 
 
1. 어떤 엔디안인지 파악하는 방법은

(1) 컴파일러 또는 시스템 고유의 매크로가 정의되어있는지 판단하는 방법 : 예를 들어 __sparc__ 가 정의되어 있다면 big endian

(2) 실시간에 판단하는 방법 :
코드:

union {
    short i2;
    char  i1[2];
} val;
val.i2 = 0x0102;
if( i1[0]==0x02 ) little_endian();
else big_endian();



2. 2바이트 이상의 값이면 모두 엔디안의 영향을 받습니다.
그러므로, double 도 예외가 아닙니다.

3. 무조건 고정된 엔디안을 사용하는 것보다는 선택할 수
있게 하는 게 더 좋겠죠. 제 경우는

읽어올 때 : 입력측 엔디안을 지정해서 시스템 엔디안으로 변경
쓸 때 : 출력측 엔디안을 지정해서 시스템 엔디안을 출력측 엔디안으로 변경

하는 입출력 함수를 새로 정의했습니다. coral.kldp.net
라이브러리에 정의되어 있는 함수입니다.

4. 값을 뒤집는 방법은 효율적으로 잘 뒤집으면 됩니다.
그리고 현존하는 기계들의 엔디안에는 little, big, pdp
엔디안이 있습니다. pdp 엔디안은 잘 쓰이지는 않지요.
 
 
 

MS source safe 사용법

[펀글- MS Source Safe]
sourcesafe(이하 소세) 사용법에 대해서 간단하게 말씀드리죠.
저도 프로젝트를 수행하면서 소세를 사용하였는데 좀 까다롭더라구요.
 
정식으로 메뉴얼을 보고 익힌것이 아니라 시행착오를 여러번 거치면서 배웠지요
먼저, 서버에 프로젝트 소스를 데이타베이스로 만들어야 됩니다.
하나의 서버를 설정하여야 되고 다른 조원들의 컴퓨터가 이 서버에 물려야 되죠(당연하죠?)
 
1. 그 서버용 컴에서 시작>프로그램>MS Visual Studio>MS Visual Sourcesafe>Visual sourcesafe 6.0 Admin을 실행하여 물릴 소스 파일의 디비를 설정합니다
 
2. 메뉴를 보시면 'Tools'밑에 'Create Database...'가 있는데 실행합니다.
 
3. 'Create New VSS Database'라는 대화창이 뜨면 'Browse..'버튼을 눌러 소스가 있는 폴더를 지정
그러면 디비로 자동 물립니다. 이때 그 소스폴더에는 'data','temp', 'users'폴더와 함께 'users.txt'그리고 가장 중요한 'srcsafe.ini'이 생성됩니다.
다음으로 프로젝트에 참가하는 조원을 서버에 계정시킵니다.
 
4. 메뉴에서 'users'에 'Open Sourcesafe Database'를 실행 아마 방금전에 등록시킨 데이타베이스가 없을것입니다. 그럼 찾아줘야지요.
 
5. Open Sourcesafe Database 대화창에서 'Browse...'버튼을 눌러서 방금전에 등록한 폴더에 생성된 'srcsafe.ini'를 찾아 엽니다.
 
6. 그러면 디비 페스와 그 디비 이름란의 대화상자가 나오는데 앞으로 계속 사용될 디비의 이름을
적당히 줍니다. 자동설정값으론 그 폴더이름이 되어있을 것입니다. 아무렇게나 주십시오.
확인키를 누르면 다시 Open Sourcesafe Database 대화창으로 가고 그곳에 지금 방금 등록한 디비가
생성됩니다.
바로 그 디비를 열어주면 현재 관리자(Admin)의 비밀번호가 없다고 하는 메세지가 나오고
확인키를 누르면 O.K.!
 
7. Admin의 패스워드와 소세를 사용할 사람들에게 ID와 Password를 주면 등록끝!!!
이제 막바로 소세를 이용하여 프로그래밍을 하면 되냐고요? 아닙니다.
다음으로 소스폴더를 디비로 물리면 그 디비폴더에 함께 사용할 소스를 등록시켜야 됩니다.
 
8. 시작>프로그램>MS Visual Studio>MS Visual Sourcesafe>Microsoft Visual Souresafe 6.0을 실행
 
9. Visual SourceSafe Explorer 가 실행되고 윈타이틀 옆에 현재 Open되어 있는 디비가 나오는데
사용할 디비를 Open합니다. (아마 이 순서로 하면 자동으로 오픈되어 있을꺼예요)
 
10. 메뉴의 File>Create Project..를 실행하고 폴더명(예로 chichi)을 주고 그 폴더에서 사용할 소스를
File>Add Files..로 등록합니다.

res폴더 또한 소세에 물려서 사용하려면 생성된 폴더(chichi) 밑에 다시 res폴더를 만들어 주고 그 폴더에도 사용할 resource파일을 Add Files..로 등록합니다.
 
이렇게 하면 소세를 이용한 프로그래밍의 setup작업 끝!!!

이젠 실제로 하나의 소스를 이용하여 프로그래밍하는 방법을 설명하겠습니다.
 
11. VC++를 실행하고 File>Open Workspace..를 실행하면 대화창에 'Source Cotrol'키 누름
 
12. Visual SourceSafe Login 창이 나오면서 등록된 사용자의 ID와 Password를 입력합니다.
물론 Database는 전에 설정한 디비를 선택하셔야 되겠죠? 한번에 여러개의 프로젝트를 하면 분명
여러개의 디비가 있을것입니다. 그러니 사용하고자 하는 디비를 잘 선택하여야 됩니다.
 
13. Create local project from SourceSafe창이 나오면 로컬컴에 작업할 소스를 서버에서 다운로드하여야 하므로 작업할 폴더를 설정합니다.
그러면 서버에 있는 소스가 그 폴더로 옮겨 오게 됩니다.
 
14. 그러면 Open Workspace창이 다시 나와 서버의 xxxxx.dsw를 오픈하면 된다.
간혹 Class View가 에러가 날수 있다. 이유는 다운받은 소스가 읽기전용이라 그럴것입니다.
그러니 소스 모두 등록정보에서 읽기전용의 체크마크을 없애주길 바랍니다.
제대로 오픈이 되었을텐데 역시 속도가 많이 느릴것입니다.
소세를 사용할때는 주의하여야 할 몇가지가 있습니다.
먼저 계속해서 소스를 최신버전으로 바꿔야됩니다.

VC++ 메뉴에서 project>Source Control..>Get Latest Version으로 최신버전을 받고
한사람이 소스의 한 부분을 고치려면 서버에 체크아웃(Check Out)을 요청해서 코딩하고 작업을 끝마치면 반드시 서버에 자신이 손댄 부분을 체크인(Check In) 해주어야 됩니다.

(project>Source Control..>Check Out  & project>Source Control..>Check In)

한사람이 체크아웃해서 변경중인 코드는 다른사람의 접근이 불가하게 됩니다.
계속해서 체크인, 체크아웃을 물어보는 대화창이 나오므로 무시하지 말고 자세히 드려다 보고
시키는데로 따라하면 별 문제가 없을 것입니다.

참고로 resource 부분을 무시하지 말길 바랍니다.
리소스를 건드렸다가 체크인을 하지 않아서 고치기 전의 기존파일로 다시 엎어쓴 경험이 있습니다.
소세는 편리함을 주기위해 만들어졌는데 사용미숙으로 많은 낭패를 보는 프로그램 중 하나입니다.
그렇다고 프로젝트를 클래스별로 나눠서 코딩하고 나중에 합쳐 사용하면 되겠지만 리소스에서
충돌이 나는 경우가 종종있어 그것도 유의하여야 합니다.

이 메뉴얼은 기존의 메뉴얼의 도움없이 많은 시행착오로 얻은 지식을 적어놓은 것이라 틀린 부분이
있을 수 있습니다. 그러니 틀린부분이나 도움이 될만한 내용이 있으면 연락 주시기 바랍니다.
지식공유가 발전된 한국을 만듭니다.

mysql 설치 문제

mysql 설치 문제.
조회 (82)
sql | 2004/07/21 (수) 13:57
공감 스크랩 수정 삭제
첨에 mysql 설치하고 실행할 때 mysql.sock가 없다나... 그런 식으로 에러가 뜨면서 mysql이 실행이 안 될때가 있다. 이럴때 mysql.sock가 위치한 (보통 /var/run/mysqld에 위치한다.) 디렉토리의 소유권을 보고 그 소유권에 알맞게 권한을 설정하도록 한다. =>mysql이란 그룹에 사용자를 추가 시키면 된다.

'develop > sql' 카테고리의 다른 글

mysql 관리용 툴  (0) 2006.12.19
mysql 사용자 추가하기  (0) 2006.12.19
mysql 외부에서 접속하기  (0) 2006.12.19
mysql 새로운 사용자 계정 설정법  (0) 2006.12.19

mysql 관리용 툴

Mysql 관리용 툴
조회 (250)
sql | 2004/10/24 (일) 23:42
공감 스크랩 수정 삭제
Mysql 관리용 툴



1) mysqladmin



Usage: mysqladmin [OPTIONS] command command....

-?, --help 도움말을 출력한다.
-h, --host=... 특정 호스트에 연결
-p, --password[=...] 패스워드 입력
-P, --port=... 연결하고자 하는 서버의 포트번호
-S --socket=... Socket file to use for connection
-S, --socket=... 소켓을 이용하여 연결
-u, --user=# 새로운 유저로 연결
-V, --version 버전을 보여준다.

command:

create databasename 데이타베이스를 생성한다.
drop databasename 데이타베이스를 삭제한다.
password new-password 새로운 패스워드를 입력
ping Check if mysqld is alive
processlist Show list of active threads in server
reload 권한을 다시 reload한다.
shutdown 서버를 셧다운한다.
status 현재의 상태를 보여준다.
variables 설정된 값을 보여준다
version 버전을 보여준다.

2) mysqlshow

- 현재의 테이타베이스 및 테이블의 내용을 보여준다.

Usage: mysqlshow [OPTIONS] [database [table [field]]]

-?, --help 도움말을 출력한다.
-h, --host=... 특정 호스트에 연결
-p, --password[=...] 패스워드 입력
-P, --port=... 연결하고자 하는 서버의 포트번호
-S --socket=... Socket file to use for connection
-S, --socket=... 소켓을 이용하여 연결
-u, --user=# 새로운 유저로 연결
-V, --version 버전을 보여준다.


shell> mysqlshow
+-----------+
| Databases |
+-----------+
| mysql |
| test |
+-----------+

shell> mysqlshow mysql
Database: mysql
+--------------+
| Tables |
+--------------+
| columns_priv |
| db |
| func |
| host |
| tables_priv |
| user |
+--------------+

shell> mysqlshow mysql user
Database: mysql Table: user Rows: 7
+-----------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+---------------+------+-----+---------+-------+
| Host | char(60) | | PRI | | |
| User | char(16) | | PRI | | |
| Password | char(16) | | | | |
| Select_priv | enum(\N\,\Y\) | | | N | |
| Insert_priv | enum(\N\,\Y\) | | | N | |
| Update_priv | enum(\N\,\Y\) | | | N | |
| Delete_priv | enum(\N\,\Y\) | | | N | |
| Create_priv | enum(\N\,\Y\) | | | N | |
| Drop_priv | enum(\N\,\Y\) | | | N | |
| Reload_priv | enum(\N\,\Y\) | | | N | |
| Shutdown_priv | enum(\N\,\Y\) | | | N | |
| Process_priv | enum(\N\,\Y\) | | | N | |
| File_priv | enum(\N\,\Y\) | | | N | |
| Grant_priv | enum(\N\,\Y\) | | | N | |
| References_priv | enum(\N\,\Y\) | | | N | |
| Index_priv | enum(\N\,\Y\) | | | N | |
| Alter_priv | enum(\N\,\Y\) | | | N | |
+-----------------+---------------+------+-----+---------+-------+

'develop > sql' 카테고리의 다른 글

mysql 설치 문제  (0) 2006.12.19
mysql 사용자 추가하기  (0) 2006.12.19
mysql 외부에서 접속하기  (0) 2006.12.19
mysql 새로운 사용자 계정 설정법  (0) 2006.12.19

mysql 사용자 추가하기

mysql에 사용자 추가하기
조회 (179)
sql | 2004/11/04 (목) 14:55
공감 스크랩 수정 삭제

바로 앞에서 db라는 테이블에 새로 생성한 TESTDB를 등록한 것처럼 새로운 mysql 사용자를 생성하려면 user라는 테이블에 등록을 해야합니다.
즉, 잠깐 정리를 하자면 mysql이라는 MYSQL 관리용데이터베이스에는 몇 개의 테이블이 존재하는데 이중 db라는 테이블에는 모든 데이터베이스의 속성(소유자, 권한등)에 관한 내용이 등록되어 있으며, user라는 테이블에는 mysql을 사용할 데이터베이스 사용자정보가 들어 있습니다.
따라서, mysql을 사용할 사용자는 반드시 user라는 테이블에 등록을 해줘야합니다.
다음의 등록예를 보시기 바랍니다.
위의 예는 sspark이라는 사용자를 user라는 테이블에 등록을 한 것입니다.
다음은 정상적인 등록여부를 select구문으로 확인해 본 것입니다.
sspark이라는 사용자가 등록된 것을 확인해 볼 수 있습니다.
이제부터는 sspark이라는 사용자는 mysql을 사용할 수 있습니다.
다음은 다시 밖으로 나가서 sspark이라는 사용자로 다시 접속을 해보겠습니다.
밖으로 빠져나왔습니다.
이제 sspark이라는 사용자로 mysql데이터베이스로 접속한 예입니다.
물론 좀전에 sspark이라는 사용자를 생성할 때 입력했던 패스워드를 입력해야만 접속이 됩니다.
참고로, 새로운 데이터베이스를 생성하거나 새로운 사용자를 생성한 후에는 반드시 reload를 해줘야만 적용이 됩니다.
따라서 다음과 같이 reload를 해줘야만 합니다.

'develop > sql' 카테고리의 다른 글

mysql 설치 문제  (0) 2006.12.19
mysql 관리용 툴  (0) 2006.12.19
mysql 외부에서 접속하기  (0) 2006.12.19
mysql 새로운 사용자 계정 설정법  (0) 2006.12.19

mysql 외부에서 접속하기

mysql 외부에서 접속하기
조회 (337)
sql | 2004/11/04 (목) 15:08
공감 스크랩 수정 삭제
기본적으로  mysql은  localhost에서만 접속 가능하게 셋팅을 하구요
바꾸어 주려면요..
msyql db에서
...음.. 예를 들어서요.
test 라는 database를 외부에서 접속 가능하게 하려면...
모두 다 열어 두는 방법두 있는데 보안을 위해서 그렇게 하지는 않구 요..
특정 IP만 접속 가능하게 해야 합니다.
192.168.0.2에 있는 db 서버의 test 테이블을
192.168.0.100 의 사용자가 접속해서 사용하려면.
create database test;
insert into db values('192.168.0.100','test','test','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
insert into user values('192.168.0.100','test',password(' 비밀번호'),'N','N','N','N','N','N','N','N','N','N','N','N','N','N');
이렇게 db를 생성하구 test라는 db 사용자로 접근 가능하게 만들어야 합니다.
결론 적으론 mysql이라는 db를 수정해야 합니다.

'develop > sql' 카테고리의 다른 글

mysql 설치 문제  (0) 2006.12.19
mysql 관리용 툴  (0) 2006.12.19
mysql 사용자 추가하기  (0) 2006.12.19
mysql 새로운 사용자 계정 설정법  (0) 2006.12.19
prev 1 ··· 4 5 6 7 8 9 next