'API 및 라이브러리/C 라이브러리 함수'에 해당되는 글 19건

  1. 2011.10.08 의사 난수 생성(pseudo-random number) : srand(), rand() 1
  2. 2011.02.12 sleep(3)
  3. 2010.09.14 strdup(3)
  4. 2010.09.11 strstr(3) 1
  5. 2009.12.19 system(3)
  6. 2009.12.19 getusershell(3)
  7. 2009.12.18 syslog, openlog(3)
  8. 2009.12.17 getutent(3)
2011. 10. 8. 02:41

<stdlib.h>

int rand ( void );

void srand ( unsigned int seed );

 

#define RAND_MAX 2147483647 (32bit 리눅스 시스템 기준)

리턴값

rand : 0부터 RAND_MAX 사이의 의사 난수를 생성 반환.

설명

rand()는 0부터 RAND_MAX 사이의 난수를 생성하지만,

문제는 프로그램을 새로 실행할 때 마다 매번 다른 난수를 만들어 내지 않고

계속 같은 난수를 반복합니다.

그래서 srand()를 사용하여 의사 난수를 생성하기 위해서 난수의 생성 초기값인

seed값을 지정합니다. (보통 seed는 srand((unsigned) time(NULL))로 설정)

 

srand()가 호출되기 전에 rand()가 호출되면 디폴트 값은 1이 됩니다.

 

보통 seed는 srand((unsigned) time(NULL))로 지정하지만 time()는 초 단위이기 때문에

1초 이내에 여러 번 실행하게 되면 같은 난수가 중복되기 때문에 getpid()와 함께

사용합니다. getpid()는 같은 프로그램을 실행해도 매번 실행할 때 마다

프로세스 아이디가 계속 증가되기 때문에 매번 다른 값을 반환하게 됩니다.

이런 이유로 time()같이 사용합니다.

 

예 : srand( (unsigned)time(NULL)+(unsigned)getpid() );

 

 

[ rand의 난수 생성범위에 따른 함수 사용 방법: ]

난수 생성범위

프로그램 연산식

설명

1 <= 정수난수 <= 45

rand() % 45+1;

45로 나눈 나머지 값의 범위는 0~44,

이 값에 1을 더하므로 1~5 사이의 난수 생성

0 <= 정수난수 <= 99

rand() % 100;

100으로 나눈 나머지 값의 범위는 0~99이므로

0~99 사이의 난수 생성.

10 <= 정수난수 <= 30

rand() % 21 + 10;

21로 나눈 나머지 값의 범위는 0~20,

이 값에 10을 더해주면 10~30 사이의 난수 생성.

-5 <= 정수난수 <= 5

rand() % 11 - 5;

11로 나눈 나머지 값의 범위는 0~10,

이 값에 5를 감해주면 -5~+5 사이의 난수 생성.

0 <= 실수난수 <= 1

rand()/(double)RAND_MAX

0~RAND_MAX의 사이의 난수를 다시 (double)RAND_MAX로 형변환된 실수로

로 나눔으로써 0~1 사이의 실수 난수를 생성.

 

Example : lotto 번호 생성

'API 및 라이브러리 > C 라이브러리 함수' 카테고리의 다른 글

sleep(3)  (0) 2011.02.12
strdup(3)  (0) 2010.09.14
strstr(3)  (1) 2010.09.11
system(3)  (0) 2009.12.19
getusershell(3)  (0) 2009.12.19
Posted by devanix
2011. 2. 12. 08:38

NAME


  • sleep – Sleep for the specified number of seconds


SYNOPSIS


#include <unistd.h>

unsigned int sleep(unsigned int seconds);


DESCRIPTION


  • sleep()를 이용하면 현재 동작중인 프로세스를 지정한 초(seconds)만큼 정지 시킨다.
  • sleep()는 SIGALRM을 이용해서 구현되 되었으므로 alarm()와 섞어서 쓰는건 좋지 않다.
  • 하나 이상의 alarm을 사용하게 될경우 먼저 설정되었던 alarm은 무효화 되어 버리기 때문이다.


RETURN VALUE


성공 0, 실패 -1반환, 적당한 errno값 설정.


EXAMPLE


지정한 n(초)가 경과될 때마다 소리를 낸다. (beeper.c)

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

 

int main(int argc, char *argv[]) {

    int sleeptime;

 

    if (argc != 2) {

        fprintf(stderr, "Usage:%s n\n", argv[0]);

        return 1;

    }

    sleeptime = atoi(argv[1]);

    fprintf(stderr, "Sleep time is %d\n", sleeptime);

    for ( ; ; ) {

        sleep(sleeptime);

        printf("\007");

        fflush(stdout);

    }

}

 

'API 및 라이브러리 > C 라이브러리 함수' 카테고리의 다른 글

의사 난수 생성(pseudo-random number) : srand(), rand()  (1) 2011.10.08
strdup(3)  (0) 2010.09.14
strstr(3)  (1) 2010.09.11
system(3)  (0) 2009.12.19
getusershell(3)  (0) 2009.12.19
Posted by devanix
2010. 9. 14. 15:18

NAME


 strdup - 문자열 복사하기.

 

SYNOPSIS


 #include <string.h>

 char *strdup(const char *s);

 

DESCRIPTION


strdup() 함수는 문자역 s 복사한 새로운 문자열에 대한 포인터를 반환한다.

 새로운 문자열에 대한 메모리는 malloc(3)으로 할당되며 free(3) 해제 된다.

 

RETURN VALUE


 strdup() 함수는 복사된 문자열에 대한 포인터를 반환하며,

 이용할수 있는 메모리가 충분하지 않으면 NULL 반환한다.

 

ERRORS


 ENOMEM 복사할 문자열을 할당하기 위해 이용할수 있는 메모리가 충분하지 않다.

 

SEE ALSO


 calloc(3), malloc(3), realloc(3), free(3)

 

EXAMPLE


#include <stdio.h>

#include <string.h>

 

int main(void) {

    char *dup;

    char *string = "twin string";

    dup = strdup(string);

    printf("%s\n", dup);

    free(dup);

    return 0;

}

'API 및 라이브러리 > C 라이브러리 함수' 카테고리의 다른 글

의사 난수 생성(pseudo-random number) : srand(), rand()  (1) 2011.10.08
sleep(3)  (0) 2011.02.12
strstr(3)  (1) 2010.09.11
system(3)  (0) 2009.12.19
getusershell(3)  (0) 2009.12.19
Posted by devanix
2010. 9. 11. 04:30

NAME

    strstr – locate a substring

 

SYNOPSIS

#include <string.h>

char* strstr(const char *haystack, const char *needle);

 

DESCRIPTION

    문자열 haystack 내에서 문자열 needle 포함되어 있는지 검사하고 만약 있다면

    부분 문자열(substring) 포인터를 리턴한다.

    Haystack è "I love korea" // needle è "love" 경우

    haystack내에 "love" 부분 문자열이 있는지 조사하고 있다면 "love korea" 문자열의

    선두번지(l 번지) 리턴한다.

 

RETURN VALUE

    부분 문자열의 선두번지.

    부분 문자열 needle haystack내에서 발견되지 않으면 NULL 리턴.

 

SEE ALSO

    strchr è 문자열내의 특정 문자를 찾는다.

    strrchr è 문자열내의 특정 문자를 문자열의 뒤에서부터 찾는다.

 

EXAMPLE

#include <stdio.h>

#include <string.h>

 

int main(void) {

char haystack[50] = "I love korea";

char needle[50] = "love";

char *rp;

 

if (( rp = strstr(haystack, needle)) == NULL)

puts("not found");

else

puts("found")

 

printf("haystack: [%s]\n", haystack);

printf("rp: [%s]\n", rp);

return 0;

}

found

haystack: [I love korea]

rp: [love korea]

'API 및 라이브러리 > C 라이브러리 함수' 카테고리의 다른 글

sleep(3)  (0) 2011.02.12
strdup(3)  (0) 2010.09.14
system(3)  (0) 2009.12.19
getusershell(3)  (0) 2009.12.19
syslog, openlog(3)  (0) 2009.12.18
Posted by devanix
2009. 12. 19. 15:48
NAME
     system - 쉘 명령어 실행기

SYNOPSIS
     #include <stdlib.h>
     int system(const char *command);

DESCRIPTION
     system() 함수는 /bin/sh -c command를 호출 하여 command에 지정된 명령어를 실행하고,
     명령어가 끝난후 반환한다. 명령어가 실행동안, SIGCHLD는 블럭되며, SIGINT, SIGQUIT는
     무시된다.
system() 함수는 기본적으로 fork()와 execve()의 조합응용이다.

RETURN VALUE
     만약 /bin/sh를 실행시키기 위한 execve()의 호출이 실패했다면 127이 리턴되며, 다른 에러가
     있다면 -1, 그렇지 않다면 명령어의 리턴코드가 반환된다.
command값이 NULL이고,
    
system()이 shell을 이용할 수 있다면 0이 아닌 값을 그렇지 않다면 0을 반환한다.
     system
()은 다른 wait()상태의 다른 자식에게 영향을 주지 않는다.

EXAMPLE

   #include <stdio.h>
   #include <stdlib.h>
   #include <sys/wait.h>

   int main(int argc, char *argv[])
   {
      int ret;
      ret = system("ls -al");
      printf("Exit Status : [%d]\n", WEXITSTATUS(ret) );
      return 0;
   }



참조:
JOINC WIKI - SYSTEM(3)

'API 및 라이브러리 > C 라이브러리 함수' 카테고리의 다른 글

strdup(3)  (0) 2010.09.14
strstr(3)  (1) 2010.09.11
getusershell(3)  (0) 2009.12.19
syslog, openlog(3)  (0) 2009.12.18
getutent(3)  (0) 2009.12.17
Posted by devanix
2009. 12. 19. 09:31

NAME
       getusershell, setusershell, endusershell - get permitted user shells

SYNOPSIS
       #include <unistd.h>
       char *getusershell(void);
       void   setusershell(void);
       void   endusershell(void);


DESCRIPTION

      The getusershell()
함수는 /etc/shells 내용을 한라인씩 읽어 리턴해준다.
      로그인시 /etc/passwd 파일에 적혀있는 사용자 쉘과 이 내용을 비교하여 적절한 사용자
      쉘을 셋팅해 준다.
/etc/shells 파일이 없거나 읽을수 없는 상태라면 시스템에 기본적으로
      제공하는 /bin/sh, /bin/csh 와같은 쉘을 리스트해 준다.


       The setusershell()  function rewinds /etc/shells.
       The endusershell() function closes /etc/shells.

RETURN VALUE
       The getusershell() 는 파일에 끝을 만나면 NULL을 리턴한다.

FILES
       /etc/shells

EXAMPLE
   setusershell ();
  while ((vshell = getusershell () ) != NULL &&
              pw && strcmp(pw->pw_shell, vshell) ) ;
 
  endusershell ();

pw 구조체에 저장된 /etc/passwd 파일의 쉘(pw->pw_shell)과  getusershell()의 리턴값을 루프를 돌면서 비교하고 있당.



'API 및 라이브러리 > C 라이브러리 함수' 카테고리의 다른 글

strstr(3)  (1) 2010.09.11
system(3)  (0) 2009.12.19
syslog, openlog(3)  (0) 2009.12.18
getutent(3)  (0) 2009.12.17
ttyname(3)  (0) 2009.04.04
Posted by devanix
2009. 12. 18. 08:31

SYSNOPSIS

void openlog(const char *ident, int option, int facility);

void syslog(int priority, const char *format, ...);

void closelog(void);

int setlogmask(int maskpri);

   

syslog

syslog 함수는 syslogd 데몬에게 메시지를 전송한다.

syslogd 데몬은 받은 메시지를 파일에다 기록하거나, 화면에다 출력하거나, 다른 호스트에 있는 또다른

syslogd 데몬에게 포워딩한다.

   

첫번째 priority 인자는 로그 메시지에 중요성을 결정하며, 우선순위는 가장 순위가 높은 LOG_EMERG에서

가장 순위가 낮은 LOG_DEBUG 이르는 계층적인 구조를 가지고 있다.

매크로

실제값

설명

LOG_EMERG

0

A panic condition. This is normally broadcast to all users.

LOG_ALERT

1

A condition that should be corrected immediately, such as a corrupted system database.

LOG_CRIT

2

Critical conditions, e.g., hard device errors.

LOG_ERR

3

Errors.

LOG_WARNING

4

Warning messages.

LOG_NOTICE

5

Conditions that are not error conditions, but should possibly be handled specially.

LOG_INFO

6

Informational messages.

LOG_DEBUG

7

Messages that contain information normally of use only when debugging a program.

두번째와 세번째는 printf 함수와 같은 포맷 문자열과 불확정 매개변수(?)이다.

   

   

openlog

openlog syslog 함수를 호출하기전에 호출하는 사전작업이라고 생각됩니다.

일반적으로 application에서 syslog 호출하기 위해서는 첫번째 하는일이  Unixdomain datagram socket

syslogd daemon 통해 만들어진  /var/run/log 소켓에connect하는 함수를 호출합니다.

하지만 openlog 함수는 이러한 소켓을 만들지 않습니다. openlog함수는 syslog 함수가 호출 되기 전에 호출할 있으며

   void openlog(const char *ident, int options, int facility);


openlog
혼자 동작되는 것이 아니며 syslog 호출을 위해서  여러가지 option  setting하는 합니다.

위에서 설명된 것을 기초로 openlog함수는 동작하며 openlog 호출한다고 해서 자동적으로  syslog 함수가 호출되는 것은 아닙니다.

로그 파일에다가 뭔가 특별한 처리를 해야 하는 경우에는, openlog 함수를 이용해야 한다.

 

첫번째 ident 인자는 모든 로그 문자열 앞에 붙을 ID 문자열이다. 보통은 프로그램 이름을 명기한다.

두번째 option 인자는 로그 방식에 대한 플래그이다. (LOG_CONS, LOG_NDELAY, LOG_PID .. 맨페이지 참조)

세번째 facility 인자는 어떤 프로그램이 로그를 생성했는가에 대한 플래그이다.

일반적으로 LOG_USER 또는 LOG_LOCAL0 ~ LOG_LOCAL7 사용하면 된다.

setlogmask 함수를 이용해, 어느 수준까지의 로그를 실제로 로그할 것인지를 정해줄 있다. LOG_UPTO 매크로를 이용하면 간단하다.

2 예제

2.1 로그에다 쓰기

     

#include <stdio.h>

#include <string.h>

#include <stdarg.h>

#include <syslog.h>

#include <unistd.h>

#include <sys/types.h>


int main(int argc, char *argv[])

{

    char *progname;

    if ((progname = strrchr(argv[0], '/')) == NULL)

        progname++;

    else progname = argv[0];
// NOTICE 레벨까지의 메시지만을 기록한다.
    setlogmask (LOG_UPTO (LOG_NOTICE));

 // 로그 메시지 셋팅.
    openlog (progname, LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1);

// 메시지를 기록
    syslog (LOG_NOTICE, "Program started by User %d", getuid ());

// NOTICE까지 기록하기로 설정했으니, 아래의 메시지는 기록되지 않는다.
    syslog (LOG_INFO, "A tree falls in a forest");

    closelog ();

    return 0;
}

   

2.2 로그 읽어들이기

위의 쓰기 예제에서 생성한 로그는 보통 /var/log/messages /var/log/syslog파일에 기록된다.



참조:
JOINC WIKI - SYSLOG 사용하기(1).
JOINC WIKI - SYSLOG 사용하기(2).

 

'API 및 라이브러리 > C 라이브러리 함수' 카테고리의 다른 글

system(3)  (0) 2009.12.19
getusershell(3)  (0) 2009.12.19
getutent(3)  (0) 2009.12.17
ttyname(3)  (0) 2009.04.04
memcpy(3)  (0) 2009.04.03
Posted by devanix
2009. 12. 17. 06:10

getutent - utmp파일을 이용해서 로그인

사용법

#include <utmp.h>

   

struct utmp *getutent(void);

struct utmp *getutid(const struct utmp *id);

struct utmp *getutline(const struct utmp *line);

struct utmp *pututline(const struct utmp *utmp);

void setutent(void);

void endutent(void);

int utmpname(const char *file);

   

   

설명

utmp는 커널에서 관리하는 로그인테이블 관리 시스템으로 현재 로그인된 유저와 언제 로그인했는지, 어떤 터미널(tty)를 사용하고 있는지, 접속한 호스트의 IP등의 정보를 남긴다. 로그아웃 했다면 언제 했는지에 대한 정보도 저장한다.

#include <utmp.h>

   

struct utmp *getutent(void);

   

   

getutent(), getutid(), getutline(), pututline()를 이용하면 utmp 구조체의 포인터를 리턴한다. utmp 구조체는 다음과 같은 멤버변수를 가진다.

struct utmp

{

short ut_type; /* type of login */

pid_t ut_pid; /* pid of login process */

char ut_line[UT_LINESIZE]; /* device name of tty - "/dev/" */

char ut_id[4]; /* init id or abbrev. ttyname */

char ut_user[UT_NAMESIZE]; /* user name */

char ut_host[UT_HOSTSIZE]; /* hostname for remote login */

struct exit_status ut_exit; /* The exit status of a

process marked as DEAD_PROCESS. *

long ut_session; /* session ID, used for

   

struct timeval ut_tv; /* time entry was made. */

int32_t ut_addr_v6[4]; /* IP address of remote host. */

char pad[20]; /* Reserved for future use. */

};

   

   

getutent()는 utmp 파일로 부터 다음 엔트리의 값을 읽어온다. 만약 utmp 파일이 열려있지 않다면 open한다. 더이상 읽을 엔트리가 없다면 NULL을 리턴한다.

getutid()는 utmp의 현재 ut_id 와 id_ut_id 가 일치하는 것을 현재 포인트부터 엔트리를 돌면서 찾아낸다. 엔트리의 끝까지 이동했을때까지 일치하는 정보가 없다면 NULL을 리턴한다.

getutline()는 ut_line 와 line->ut_line 문자열이 일치하는 것을 찾아서 리턴힌다. 일치하는 엔트리가 없다면 NULL을 리턴한다. ut_type 이 LOGIN_PROCESS인 것에 대해서 검사한다.

setutent()를 사용하면 utmp 파일의 처음으로 이동한다.

endutent() 최근 열린 utmp 파일을 닫는다.

반환값

utmp구조체에 대한 포인터를 돌려준다. 더이상 데이터가 없다면 NULL을 되돌려준다.

에러

에러가 발생하면 (struct utmp *)0 을 되돌려준다.

   

   

참조

http://www.joinc.co.kr/modules/moniwiki/wiki.php/man/3/getutent

'API 및 라이브러리 > C 라이브러리 함수' 카테고리의 다른 글

getusershell(3)  (0) 2009.12.19
syslog, openlog(3)  (0) 2009.12.18
ttyname(3)  (0) 2009.04.04
memcpy(3)  (0) 2009.04.03
isatty(3)  (0) 2009.04.02
Posted by devanix