출처 - http://www.mcthe.com/xe/?mid=study&document_srl=1237&listStyle=viewer&page=45 

 

비쥬얼 스튜디오(VC++)에서 clrscr(), gotoxy() 함수를 직접 사용하는것은 불가능하다.
왜냐면, vc++는 표준 Ansi C 이외의 함수를 거의 대부분 지원하지 않기 때문..
(위와 같은 콘솔IO 전용 함수들은 표준 Ansi C 에 포함되어있지 않음)

하지만, 방법이 있다^^
clrscr() 함수는 화면을 지우는 함수이고 이와 비슷한 역할을 하는 명령어를 실행하면 된다.
vc++에서는 다음과 같이 꼼수로 대체할 수 있다.
1
system("cls");

system() 함수는 운영체제(일반적으로 도스) 명령어를 실행시키는 함수로,
cls라는 도스 명령을 프로그램 내부에서 실행한다.

도스 명령어로 cls는 화면을 지우는 명령어이므로,
clrscr()을 쓴 것과 똑같은 결과를 얻을 수 있다.

이 때  slrscr() 함수를 위한 conio.h 헤더파일은 선언해줄 필요가 없다.
대신, system() 함수를 위한 stdlib.h 헤더파일을 반드시 선언해주어야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>  // 입출력
#include <conio.h> // getch()를 위해 선언한 것.
                          // 이 헤더파일은 system()하고 관계 없음 -_-;
#include <stdlib.h> // system() 함수 사용.
 
int main(void)
{
    printf("Press any key to clear screen...");
    getch(); // 키 하나를 입력받을때까지 대기.
    system("cls"); // 화면을 지움.
 
    return 0;
}

또 하나 예를 들면..
gotoxy() 함수는 커서의 위치를 이동시키는 함수이다.
이 함수를 대체하려면 비슷한 효과를 내는 SetConsoleCursorPosition() 함수를 사용해야 한다.
(윈 API 에서 기본적으로 제공하는 함수중임, 이름이 좀 길죠. -_-;)
곧바로 사용하면 안되고 아래와 같이 응용하셔서 사용하면 된다.
그대로 복사해갖고 쓰면 됨.
소스 처음 부분에 반드시 프로토타입 선언을 해주어야 함!!
1
2
3
4
5
void gotoxy(int x, int y)
{
    COORD Pos = {x - 1, y - 1};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}

gotoxy() 함수랑 100% 똑같은 역할을 하고,
물론 사용법도 gotoxy() 함수랑 동일함.

마찬가지로 위의 방법을 사용할 때 conio.h 헤더파일을 선언할 필요는 없다.
하지만 windows.h 헤더파일을 반드시 선언해주셔야 한다.

아래 소스 코드 참고..
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <windows.h> // SetConsoleCursorPosition(), GetStdHandle()
#include <stdio.h>       // 입출력
 
void gotoxy(int x, int y); // 모든 함수에서 (main()함수 포함)
                                    // 이 함수를 사용할 수 있도록 프로토타입을 선언.
int main(void)
{
    gotoxy(15, 10); // 현재 커서의 위치를 가로 15, 세로 10 으로 바꿈.
    printf("* (15, 10)"); // 출력. -_-a
    return 0;
}
 
void gotoxy(int x, int y)
{
    COORD Pos = {x - 1, y - 1};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}

Randomize Statement

 

Description

난수 발생기를 초기화합니다.

 

Syntax

Randomize [number]

수는 유효한 수식이면 됩니다.

 

Remarks

Randomize문은 수를 사용하여 Rnd 함수의 난수 발생기를 초기화하고 새 시드 값을 제공합니다.

수를 생략하면 시스템 타이머에서 반환하는 값을 새 시드 값으로 사용합니다.

 

Randomize문을 사용하지 않으면 인수가 없는 Rnd 함수에서는 처음 호출되었을 때의 동일한 값을 시드 값과 같은 숫자를 사용한 다음 그 이후로는 마지막으로 발생한 숫자를 시드 값으로 사용합니다.

 

주의  난수 발생 순차를 반복하려면, 숫자 인수를 Randomize문에 사용하기 바로 전에 Rnd 함수를 음수 인수로 호출합니다.

         같은 값의 수를 Randomize문에 사용하면 이전의 순차를 반복하지 않습니다.

 

Randomize 문의 사용법
01.<%
02.Dim rndValue, rndSeed
03.rndSeed = 40  '1~40
04.  
05.Randomize   ' 난수 발생기 초기화
06.rndValue = Int((rndSeed * Rnd) + 1) ' 1에서 40까지 무작위 값 발생
07.  
08.Response.Write rndValue
09.%>

 

여기까진 기본 이론이고..

 

메인 LINE TALK 에 초기 이미지를 랜덤하게 셋팅해주고자 1부터 40까지의 난수를 발생시켜봤다.

이참에 임시 비밀번호나 코드를 발급에도 용이하도록 지정된 길이로 숫자/문자 난수를 만들어내는 함수를 만들어본다

 

원하는 길이로 랜덤 숫자, 문자열 만들기
01.<%
02.'지정길이로 랜덤 숫자 만들기 (최대 15자리)
03.Function Func_getRndNum(ByVal rLen)
04.          IF rLen > 15 Then rLen = 15
05.  
06.          Dim idx, rndSeed, rndSeed2
07.          rndSeed = ""
08.          rndSeed2 = "1"
09.  
10.          For idx = 1 To rLen
11.                    rndSeed = rndSeed &"1"
12.                    rndSeed2 = rndSeed2 &"0"
13.          Next
14.  
15.          rndSeed = Int(rndSeed)
16.          rndSeed2 = Int(rndSeed2)
17.  
18.          Randomize
19.          Func_getRndNum = Int(Rnd(rndSeed)*rndSeed2)
20.End Function
21.  
22.'지정길이로 랜덤 문자 만들기
23.Function Func_getRndChr(ByVal rLen)
24.          Dim rtnStr
25.  
26.          Randomize
27.          For idx = 1 To rLen
28.                    rtnStr = rtnStr & Chr(Int(2*Rnd)*32 + Int((90-65+1)*Rnd + 65))
29.          Next
30.  
31.          Func_getRndChr = rtnStr
32.End Function
33.  
34.Response.Write "랜덤숫자 : "& Func_getRndNum(5) &"<br>"
35.Response.Write "랜덤문자 : "& Func_getRndChr(10) &"<br>"
36.%>

 

심플하게 정리해보자면..

 

 Int(Rnd(11111) * 100000

5자리 랜덤 숫자를 만들려면 이처럼 1과 0의 갯수를 5개로 만들어주면 OK.

대신 자릿수가 너무 커지면 Overflow~

 

그리고 001 ~ 040 까지의 값을 원한다면 첫번째 예제를 이용해서 1~40까지의 랜덤수를 생성하고

 Right("00" & Int((40 * Rnd) + 1), 3

이렇게 자릿수를 맞춰주면 된다.

 

출처 - http://www.devholic.net/1000448

콘솔창에서는 주로 문자를 입출력하는데 다음 입출력될 위치는 커서가 가리킨다. 사용자는 주기적으로 깜박거리는 커서를 보고 자신이 입력한 문자가 이 위치에 나타난다는 것을 알 수 있으며 또한 다음 출력될 위치도 알게 된다. 통상적인 경우 커서는 꼭 필요하지만 게임같은 경우에는 커서가 오히려 게임 진행에 방해가 되므로 표시하지 않는 것이 더 좋다. 14장의 여러 게임들을 실행해 보면 커서가 보이지 않는데 커서가 있는 상태로 게임을 실행해 보면 이 함수가 왜 필요한지를 알 수 있을 것이다.

setcursortype 함수는 커서의 형태를 변경하는데 괄호안의 인수로 NOCURSOR를 전달하면 커서가 사라지고 NORMALCURSOR라고 주면 커서가 다시 나타난다. 게임을 시작하기 전에 커서를 없애 버리는 것이 좋고 게임이 끝날 때 다시 나타나도록 한다. 물론 커서는 잠시 숨겨지는 것이지 커서 자체가 없어지는 것은 아니다. 커서는 보통 문자 아래쪽의 얇은 두 줄로 표시되는데 SOLIDCURSOR로 지정하면 문자 높이만큼의 크기를 가진다.

#include <stdio.h>
#include <conio.h> //getch()
#include <windows.h> //SetConsoleCursorInfo(), GetStdHandle(), CONSOLE_CURSOR_INFO

#define TRUE 1
#define FALSE 0
typedef enum {NOCURSOR, SOLIDCURSOR, NORMALCURSOR}CURSOR_TYPE;

void setcursortype(CURSOR_TYPE);

void main()
{
 setcursortype(NORMALCURSOR);
 printf("Normal cursor type.\n");
 getch();
 setcursortype(SOLIDCURSOR);
 printf("Big cursor type\n");
 getch();
 setcursortype(NOCURSOR);
 printf("No cursor type\n");
 getch();
 setcursortype(NORMALCURSOR);
}

void setcursortype(CURSOR_TYPE c)
{
 CONSOLE_CURSOR_INFO Curinfo; // console sursor 구조체
 switch(c)
 {
 case NOCURSOR:
  Curinfo.dwSize = 1; //cursor size
  Curinfo.bVisible = FALSE; // cursor 안보임
  break;
 case SOLIDCURSOR:
  Curinfo.dwSize = 100;
  Curinfo.bVisible = TRUE;
  break;
 case NORMALCURSOR:
  Curinfo.dwSize = 20;
  Curinfo.bVisible = TRUE;
  break;
 }
 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &Curinfo);
}
/* GetStdHandle(STD_OUTPUT_HANDLE) : 현제 console의 handle을 구하는 함수
SetConsoleCursorInfor(consoleHandle, consoleCursorInformationStruct)
*/

 

 

출처 - http://sotooto.blogspot.kr/2010/05/setcursortype%EC%BB%A4%EC%84%9Conoff.html

출처 - http://itguru.tistory.com/66 

 

sprintf

#include <stdio.h> // C++ 에서는 <cstdio>

int sprintf ( char * str, const char * format, ... );



str 에 데이터를 형식에 맞추어 쓴다.
str 가 가리키는 배열에 형식 문자열에 지정한 방식 대로 C 문자열을 쓴다. 쉽게 설명하자면, printf 에서 화면에 출력하는 대신에 화면에 출력할 문자열을 인자로 지정한 문자열에 쓴다는 것이다. 이 때, 인자로 지정한 배열의 크기는 배열에 쓰여질 문자열의 크기 보다 커야만 한다. 주의할 점은 sprintf 함수는 자동적으로 str 맨 마지막에 NULL  문자를 붙이기 때문에 항상 한 칸의 여유가 있어야 한다.

   인자
 

str

C 문자열이 저장될 char 배열을 가리키는 포인터

 
format

위 str 에 쓰여질 문자열을 포함하는 형식 문자열으로, 이는 형식 태그를 포함할 수 있다. 이 때, 형식 태그는 부수적 인자로 지정한 데이터와 치환되어 쓰여지게 된다. 이 때, 데이터가 치환되는 방식은 형식 태그에 의해 좌우된다. 따라서 부수적 인자의 개수는 적어도 형식 문자열에 사용된 형식 태그의 수 보다 많아야 한다.

  • 형식 태그는 아래와 같이 생겼다.

  • %[플래그(flag)][폭(width)][.정밀도][크기(length)]서식 문자(specifier)

  • 이 때 서식 문자(specifier) 는 대응하는 인자를 어떠한 형태로 표현할지를 결정하는데에 가장 중요한 역할을 한다.

  • 서식문자 출력 형태

    c 문자
    a
    d or i 부호 있는 십진법으로 나타난 정수 392
    e 지수 표기법(Scientific notation) 으로 출력하되, e 문자를 이용한다.
    3.9265e+2
    E 지수 표기법(Scientific notation) 으로 출력하되, E 문자를 이용한다. 3.9265E+2
    f 십진법으로 나타낸 부동 소수점 수
    392.65
    g %e 나 %f 보다 간략하게 출력 392.65
    G %E 나 %f 보다 간략하게 출력 392.65
    o 부호 있는 팔진수
    610
    s 문자열
    sample
    u 부호없는 십진법으로 나타낸 정수
    7235
    x 부호없는 16 진법으로 나타낸 정수 (소문자 사용)
    7fa
    X 부호없는 16 진법으로 나타낸 정수 (대문자 사용)
    7FA
    p 포인터 주소
    B800:0000
    n 아무것도 출력하지 않는다. 그 대신, 인자로 부호 있는 int 형을 가리키는 포인터를 전달해야 되는데, 여기에 현재까지 쓰여진 문자 수가 저장된다.
    % % 다음에 %를 또 붙이면 stdout 에 % 를 출력한다.

  • 위 서식 문자를 이용한 다양한 출력 형태는 아래와 같다.

  • #include <stdio.h>
    int main()
    {
        int integer = 123;
        char character = 'c';
        char string[] = "hello, world";
        int* pointer = &integer;
        double pi = 3.141592;
        char buf[100];
        

        sprintf(buf, "integer : (decimal) %d (octal) %o \n", integer, integer);
        printf("%s \n", buf);

        sprintf(buf,"character : %c \n", character);
        printf("%s \n", buf);

        sprintf(buf,"string : %s \n", string);
        printf("%s \n", buf);

        sprintf(buf,"pointer addr : %p \n", pointer);
        printf("%s \n", buf);

        sprintf(buf,"floating point : %e // %f \n", pi, pi);
        printf("%s \n", buf);

        sprintf(buf,"percent symbol : %% \n");
        printf("%s \n", buf);

        return 0;

  • 출력 결과

  • 출처 - http://forum.falinux.com/zbxe/?document_srl=408126&mid=C_LIB&sort_index=readed_count&order_type=desc

     

    설명

    문자열을 문자로 자르는 함수 입니다. 예로, "forum.falinux.com"을 "."으로 자르기를 하면 함수를 호출할 때 마다 "forum", "falinux", "com"의 선두 번지의 포인터를 반환합니다.

    처음에는 자르기 대상인 문자열과 자르기를 위한 문자를 인수로 호출합니다.

    strtok( str, sep);

    이후에는 문자열 대상을 NULL과 자르기를 위한 문자만 인수로 전달합니다.

    strtok( NULL, sep);

    더 이상 구할 문자열이 없다면 NULL이 반환됩니다.

    *** 주의 ***

    strtok()는 잘라 낸 문자열을 구하기 위해 대상 문자열에 NULL을 추가합니다. 즉, 원래의 문자열 내용이 변경 되므로 주의해야 합니다.

    헤더 string.h
    형태 char *strtok(char *restrict s1, const char *restrict s2);
    인수
    char *s1 자르기 대상 문자열
    char *s2 잘라 내기 위한 문자 모임
    반환
    char * 잘라 내기한 문자열의 첫번째 포인터를 반환하며, 문자열이 없다면 NULL을 반환

    예제

    #include <stdio.h>
    #include <string.h>
    
    int main( void)
    {           
       char   str[] = "forum falinux com";
       char	*ptr;
       int	 ndx;
    
       printf( "함수 호출 전: %s\n", str); 
    
       ptr = strtok( str, " ");
       printf( "%s\n", ptr); 
       
       while( ptr = strtok( NULL, " "))
       {
    	   printf( "%s\n", ptr); 
       }
       
       printf( "함수 호출 후: %s\n", str); 
    
       // 함수 호출 후에는 원본 문자열의 내용이 바뀌므로 주의해야 합니다.
            
       printf( "문자열의 변화\n", str); 
      
       for( ndx=0; ndx < 17; ndx++)
    	   printf( "%c %d\n", str[ndx], str[ndx]); 
    	   
       return 0;
    }
    

     

    출처 - http://mintnlatte.tistory.com/444

     

    (1) Declation
    : atoi() : 문자열을 정수로 변환한다.


     int atoi(const char *str)
     
    - str : 변환하기 위한 정수 문자열


    (2) Return Value

    - Succ = 변환에 성공한 정수 값 반환
    - Fail = 0 반환


    (3) Descriptions
    : atoi() 함수는 문자열을 정수로 변환하는 함수이다.

    - 정수로 된 문자열을 전달하여 int 형 정수로 변환한다.
    - 전달된 문자열에 정수가 아닌 문자가 포함될 경우 문자 이전까지만 변환하고 값을 반환한다.
    - 정수가 존재하지 않는 문자열을 전달할 경우 실패하여 0을 반환한다.
    - 음수의 경우 '-'를 음수 부호로 해석해서 정상적인 반환처리가 이루어 진다.
    - 문자열의 앞에 나오는 공백은 탭이나 개행 문자까지 포함해서 모두 무시된다.
    - 부호는 '+'나 '-' 기호 중에서 한 번만 나올 수 있고, 중복되어 나오면 두 번째 기호에서 변환에 실패한다.
    - 공백이나 부호가 "숫자" 중간에 올 경우 공백이나 부호 이전까지만 변환하고 값을 반환한다.
    - int 자료형을 사용하기 때문에, 오버플로우가 발생할 수 있다는 사실을 염두해야한다.
     

    (4) Example

     

    - Source

     

     

     

    - result

     

    출처 - http://forum.falinux.com/zbxe/index.php?document_srl=408173&mid=C_LIB

     

     

    설명

    2개의 메모리 변수에 대해 내용을 비교하여 첫 번째 인수보다 두 번째 인수가 같은지, 큰지, 작은지를 구합니다.

    헤더 string.h
    형태 int memcmp(const void *s1, const void *s2, size_t n);
    인수 void *s1 비교 대상 메모리 포인터
    void *s2 비교할 메모리 포인터
    size_t n 비교할 바이트 크기
    반환 int
    • 양의 정수 : s1 이 s2보다 크다.
    • 0 : s1과 s2가 같다.
    • 음의 정수 : s1보다 s2가 크다.
    예제
    #include <stdio.h>
    #include <string.h>
    
    int main( void)
    {
       char   *ptr1 = "forum";
       char   *ptr2 = "forum";
       char   *ptr3 = "forum.falinux";
       char   *ptr4 = "falinux";
       char   *ptr5 = "com";
    
    
       printf( "%s with %s = %dn", ptr1, ptr2, memcmp( ptr1, ptr2, strlen(ptr1)));
       printf( "%s with %s (ptr1 size)= %dn", ptr1, ptr3, memcmp( ptr1, ptr3, strlen(ptr1)));
       printf( "%s with %s (ptr3 size)= %dn", ptr1, ptr3, memcmp( ptr1, ptr3, strlen(ptr3)));
       printf( "%s with %s = %dn", ptr1, ptr4, memcmp( ptr1, ptr4, strlen(ptr1)));
       printf( "%s with %s (ptr1 size)= %dn", ptr1, ptr5, memcmp( ptr1, ptr5, strlen(ptr1)));
       printf( "%s with %s (ptr5 size)= %dn", ptr1, ptr5, memcmp( ptr1, ptr5, strlen(ptr5)));
    
       return 0;
    }
    

    출처 - http://www.devblog.kr/r/8y0gFPAvJ2p9ZANhTI6uJa8XI4jchsrnl9oswwCKNR9D0xIIeR

     

    C프로그램의 파라미터 파싱 및 처리

    문자열 파싱은 스크래치 상태(아무것도 없는 빈 상태)로부터 구현하기가 만만치 않은데, 이를 도와주는 라이브러리 함수가 있으니 바로 unistd.h에 정의된 getopt() 함수이다.

    getopt()

    이 함수의 원형은 다음과 같다.

    int getopt(int argc, char * const argv[], const char *optstring);
    

    이 함수의 파라미터는 간단한다.

    1. argc, argv : main() 함수가 받은 파라미터를 그대로 전달한다.
    2. optstring : 파싱해야 할 파라미터를 쓴다. 옵션이 별도의 파라미터를 받는 경우 콜론을 함께 쓴다.

    예를 들어 -h, -v, -f filename을 받는 세 가지 옵션이 있다고 하면 옵션스트링은 "hvf:"가 된다. 각각의 옵션을 파싱해내기 위해서는 getopt()함수가 0을 리턴할 때까지 계속해서 반복하면 된다.

    그외 전역변수

    이 함수와 관련된 전역 변수에는 다음과 같은 것들이 있다.

    • optarg : 옵션 뒤에 별도의 파라미터 값이 오는 경우, 이를 파싱한 결과 파라미터 값은 optarg에 문자열로 저장된다.
    • optind : 다음번 처리될 옵션의 인덱스이다. 만약 파싱한 옵션이후에 추가적인 파라미터를 받는다면 (예를 들어 입력 파일 이름 같이) 이 값을 활용할 수 있다. getopt()함수는 한 번 호출될 때마다 이 값을 업데이트한다.
    • opterr : 옵션에 문제가 있을 때, 이 값은 0이 아닌 값이되며, getopt()함수가 메시지를 표시하게 된다.
    • optopt : 알 수 없는 옵션을 만났을 때 해당 옵션이 여기에 들어간다. (이 때 getopt의 리턴값은 ‘?’가 된다.)

    샘플 코드

    아래 샘플 코드는 간략한 예를 보여준다. 이 코드에서는 a, b, c의 세 옵션을 인식하며 각각의 옵션이 주어지는 경우 해당 플래그 변수를 1로 정의하고 그 결과를 출력한다.

    1:  #include <stdio.h>
    2:  #include <unistd.h> // for getopt()
    3:  
    4:  int main(int argc, char * const * argv){
    5:      int flag_a = 0, flag_b = 0, flag_c = 0;
    6:      int c; // option
    7:      while( (c = getopt(argc, argv, "abc")) != -1) {
    8:          // -1 means getopt() parse all options
    9:          switch(c) {
    10:             case 'a':
    11:                 flag_a=1;
    12:                 break;
    13:             case 'b':
    14:                 flag_b=1;
    15:                 break;
    16:             case 'c':
    17:                 flag_c=1;
    18:                 break;
    19:             case '?':
    20:                 printf("Unknown flag : %c", optopt);
    21:                 break;
    22:         }
    23:     }
    24:     if(flag_a) {printf("flag a is ON \n");}
    25:     if(flag_b) {printf("flag b is ON \n");}
    26:     if(flag_c) {printf("flag c is ON \n");}
    27:     return 0;
    28: }
    

    보통 while문으로 루프를 돌면서 옵션들을 하나씩 검사한다. getopt가 optstring으로 정의되지 않은 옵션문자를 만나면 opterr 값이 세팅되고, 동시에 getopt()함수가 해당 문자에 대해 메시지를 출력한다. 이 때 반환값은 '?'가 되고 이때 알 수 없는 옵션 문자는 optopt에 저장된다.

    추가 파라미터를 필요로하는 옵션

    gcc의 -o와 같이 파일 이름등의 추가 파라미터를 필요로하는 옵션은 다음과 같이 처리한다.

    1. optsting에서 옵션 문자 뒤에 콜론을 붙인다. "abcf:"와 같은 식으로 쓴다.
    2. getopt()함수는 -f를 만나면 자동으로 그 뒤에 붙은 문자열을 공백까지 탐색하여 이를 optarg에 복사한다.
    3. 처리시에는 리턴값이 ‘f’인 경우 optarg의 값을 그대로 액세스하면 된다.

    이러한 처리 코드는 아래와 같다.

    case 'f':
        memcpy(file_name, optarg, strlen(optarg));
        break;
    

    또한 파라미터가 있다고 정의한 경우, 파라미터 값이 빠진채로 실행되었다면 이 때는 옵션이 인식할 수 없는 옵션으로 처리된다.

    case '?':
        if(optopt == 'f') {
            printf("option -f requires FILENAME\n");
        }
        break;
    

    optind

    옵션문자들을 모두 처리한 이후에 프로그램 자체의 파라미터를 처리하기 위해서는 optindargv의 인덱스로 사용하여 파라미터를 전달 받을 수 있다.

    그외 긴 이름

    --output등의 긴 이름 옵션을 사용하기 위해서는 getoptlong함수를 사용한다.

    출처 - http://bbolmin.tistory.com/35

     

    먼저 system함수를 알아 보겠습니다.

     

    원형은 int system(const char* command)이며 command에 해당하는 명령어를 수행하는 함수입니다.

    (반환형이 int인데 성공시 0을 반환, 실패시 -1을 리턴합니다.)

     

    system함수로 ls명령어를 실행해본 화면입니다.

       ->

     

    /bin/ls처럼 절대 경로말고 ls로만 입력해도 ls가 실행됩니다. (환경변수 PATH를 이용하는 듯..)

    그리고 옵션을 사용할 때는 단순히 "/bin/ls -a"와 같이 해주면 됩니다.

      ->

     

     


     

     

    이제 exec계열의 함수(execl, execv, execle, execve, execlp, execvp)에 대해서 알아 보겠습니다.

     

    아래 그림에서 exec계열의 함수에 대해 자세히 설명해줍니다.

     

    위의 exec함수들을 보면 exec에다가 l, v, e, p등 여러가지가 붙어 있습니다.

     

    정리를 해보면

    1. l, v : argv인자를 넘겨줄 때 사용합니다. (l일 경우는 char *로 하나씩 v일 경우에는 char *[]로 배열로 한번에 넘겨줌) 

     

    2. e : 환경변수를 넘겨줄 때 사용합니다. (e는 위에서 v와 같이 char *[]로 배열로 넘겨줍니다.)

    3. p : p가 있는 경우에는 환경변수 PATH를 참조하기 때문에 절대경로를 입력하지 않아도 됩니다. (위에서 system함수 처럼)

    그럼 간단히 execl와 execve를 써보겠습니다.

     

    (1) execl

      ->

     

    (2) execve 

     ->

    ( 딱히 환경변수에 넣을게 없네요; )

    위와 같이 실행되는 것을 볼 수 있습니다. (만약 /bin/ls라고 안하고 ls라고 하면 실행이 안되겠죠 --> p가 붙어 있다면 PATH에서 찾기 때문에 실행됩니다.)

     

    출처  - http://molrayo.tistory.com/entry/Process-abort%ED%95%A8%EC%88%98%EC%97%90-%EA%B4%80%ED%95%9C-%EC%98%88%EC%A0%9C

     

    #include<stdlib.h>

    #include<process.h>

     

    void abort(void);

     

    리턴값

     - 함수 자체의 리턴 값은 없지만 이 함수에서 호출한 _exit 함수에서 exit 코드 3을 도스 또는 모 프로그램으로 리턴한다.

     

    기능

     - 프로그램을 종료하되 비정상적으로 종료한다. 반면 exit 함수는 프로그램을 정상 종료한다.

    abort 함수로 프로그램이 종료되면 stderr(화면)에 다음과 같은 메시지를 출력하며 _exit 함수를 호출하여 코드 3을 반환하면서 프로그램을 종료하게 된다.

     

    abnormal program termination

     

    참고 함수

    exit => 프로그램을 정상 종료한다.

    atexit, assert

     

     

    예제

     

    #include <stdio.h>
    #include <stdlib.h>

    void func(void);

    main(int argc, char *argv[])
    {
        atexit(func);
        /* atoi는 정수 형태의 문자열을 정수로 변환하는 함수로 argv[1]이 "1"이면 1로 변환.
          argv[1]이 "0"이 되어야 if 조건이 참이 됨 */
        if(!atoi(argv[1]))
          /* 비정상적으로 프로세스를 종료하는데 atexit에 의해 등록된 함수는 실행되지 않음 */
           abort();
        exit(0); /* 정상적으로 프로세스를 종료하는데 atexit에 의해 등록된 함수가 실행 됨 */
    }

    void func(void)
    {
        printf("run function\n");
    }

    + Recent posts