기본 콘텐츠로 건너뛰기

8월, 2013의 게시물 표시

[C언어] pthread 함수정리

출처 -  http://tasia.tistory.com/entry/C%EC%96%B8%EC%96%B4-pthread-%ED%95%A8%EC%88%98%EC%A0%95%EB%A6%AC pthread를 써야하는 이유는 단일 프로세서에서는 동시에 여러 작업을 하는 것처럼 유저에게 보여야하는 일이 있는데 간단한 예로 테트리스 게임같이 블록이 일정시간마다 자동적으로 내려가도록 하는 부분과 키 입력을 받을 때만 블록을 입력받은 방향으로 이동시키는 부분등... 이걸 멀티 쓰레드로 만들지 않는다면 아마 프로그래밍이 상당히 복잡해지고 구현하는데도 상당히 어려울 것이다. 이를 쉽게 처리하기위해서 pthread API 함수를 이용하여 쉽게 구현할 수 있다. pthread API 함수를 쓰기 위해서 pthread.h 파일을 include 해야만 한다. #include <pthread.h>   그리고 필히 컴파일시  -lpthread  옵션 추가해주어야만 한다. 빠뜨리면 컴파일 오류가 일어나거나 아니면 쓰레드가 정상 작동하지 않을 것이다. pthread_t : pthread의 자료형을 의미 int pthread_create( pthread_t *th_id, const pthread_attr_t *attr, void* 함수명, void *arg );  - pthread 생성한다. 첫 번째 인자 : pthread 식별자로 thread가 성공적으로 생성되면 thread 식별값이 주어진다. 두 번째 인자 : pthread 속성(옵션), 기본적인 thread 속성을 사용할 경우 NULL 세 번째 인자 : pthread로 분기할 함수. 반환값이 void* 타입이고 매개변수도 void* 으로 선언된 함수만 가능하다. ex) void* handler (void* arg) { ... } 네 번째 인자 : 분기할 함수로 넘겨줄 인자값. 어떤 자료형을 넘겨줄 지 모르기 때문에 void형으로 넘겨주고 상황에 맞게 분기하는 함수내에서 원래의 자료형으로 캐스팅해서 사용하면 된다. 리턴 값

[C언어] select / poll / epoll example

* select() #include <sys/time.h> #include <sys/types.h> #include <unistd.h> int select(int n,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout); FD_SET(int fd, fd_set *set); // fd를 set(검사대상)에 추가 FD_CLR(int fd, fd_set *set); // fd를 set에서 제거 FD_ZERO(fd_set *set);// set에 지정된 모든 대상 제거,select호출 전 항상 호출함 FD_ISSET(int fd, fd_set *set); //select()호출 후 fd가 사용 가능한지 확인 return bool ex) struct timeval tv; fd_set readfds; int ret; FD_ZERO(&readfds); FD_SET(STDIN_FILENO, &readfds); tv.tv_sec = 0; tv.tv_use = 500; ret = select (STDIN_FILENO + 1, &readfds, NULL, NULL, &tv); if(FD_ISSET(STDIN_FILENO, &readfds)){ /* 'fd' is readable without blocking! */ } * poll() #include <sys/poll.h> int poll (struct pollfd *fds, unsigned int nfds, int timeout); struct pollfd { int fd; /* file descriptor */ short events; /* requested events to watch */ short rev

[C언어] epoll 설명

출처 -  http://biscuit.cafe24.com/moniwiki/wiki.php/epoll 1  준비 2  socket 프로그래밍 기본 3  비동기 입출력 (Asyncronous I/O) & 입출력 다중화 (I/O Multiplexing) 4  select 5  select 와  poll  그리고 epoll. 그 차이 6  epoll 프로그래밍 흐름 7  epoll 함수들 8  epoll References 빈폴도 아니고, 이폴이란 대체 무엇일까? 당신은 서버한대로 몇 명의 동시접속자를 수용할 수 있습니까? 최근에 인터넷에 떠돌아다니는  c10k_problem 은 대당 10K, 즉 1만명의 동시접속(concurrent users)을 받아보자는 문제다. 서버 프로그래밍을 해 본 사람이라면 이게 그리 만만한 문제가 아니라는 것을 직감할 듯 --; 요즘의 Massive 온라인게임은 '분산처리'가 기본이라 한 대에서 많은 이용자를 커버하기보다는 여러대가 하나의 세트로써 구성하는 것이 인기가 있고 다수의 커넥션보다는 소수 커넥션에서의 대용량 전송이 더 중요한 요소이기도 하다. c10k problem에 나또한 관심을 가지게 되었고, epoll 이 최근 급부상하는 솔루션으로 인기가 있다기에 한 번 파보자 하고 결심하고 이 글을 시작했다. 마침 wiki에도 관심이 있던 차라, wiki 공부도 할 겸해서 epoll 을 연구하는 과정을 이 wiki에 담아 보고자 한다. 1  준비  # * 누구를 위한 epoll 인가? epoll은 '한 대의 서버에서 아주많은 동시접속자를 처리하기 위한 수단'이다. 이미 당신이 그 수단을 알고 있다면 - epoll 이건 아니건 - 이 글은 별로 도움이 안될듯하다. 동시접속자가 천명을 넘지않는다면 구닥다리 방법을 이용하는 것과 큰 차이가 없으리라 본다. 또한, epoll은  Linux 프로그래머의 도구 이다. M$ wind

[C언어] epoll API

 프로그래머 입장에서는 단지 3개정도의 관련 함수만 알면 어렵지 않게  epoll 응용 어플의 제작이 가능하다. 4.3.1   epoll_create (2) epoll_create(int size); epoll_create()는 이벤트를 저장하기 위한  size 만큼의 공간을 커널에 요청한다. 커널에 요청한다고 해서 반드시 size만큼의 공간이 확보되는 건 아니지만 커널이 대략 어느 정도의 공간을 만들어야 할지는 정해줄 수 있다. 수행된 후 파일 지정자를 되돌려 주는데, 이 후 모든 관련작업은 리턴된 파일 지정자를 통해서 이루어지게 된다. 모든 작업이 끝났다면  close ()를 호출해서 닫아주어야 한다.   4.3.2   epoll_wait (2) int epoll_wait (int epfd, struct epoll_event *events, int maxevents, int timeout); 실제 이벤트가 발생하는걸 기다리고 있다가, 이벤트가 발생하면 이벤트 관련 정보를 넘겨주는 일을 한다. epfd 는  epoll_create (2)를 이용해서 생성된 epoll지정자이다. 만약 이벤트가 발생하면 리턴하게 되는데, 리턴된 이벤트에 관한 정보는  events 에 저장된다.  maxevents 는 epoll이벤트 풀의 크기다. timeout 는 기다리는 시간이다. 0보다 작다면 이벤트가 발생할 때까지 기다리고, 0이면 바로 리턴, 0보다 크면  timeout  밀리세컨드 만큼 기다린다. 만약 timeout시간에 이벤트가 발생하지 않는다면 0을 리턴한다.  이벤트가 발생했다면 발생한 이벤트의 갯수를 리턴한다.  4.3.3   epoll_ctl (2) int epoll_ctl (int epfd, int op, int fd, struct epoll_event *event); 이벤트풀을 제어하기 위해서 사용한다.  poll (2)와 매우 비슷하게 작동한다. op 는  fd 에 대해서 어떤 작

[C언어] malloc, calloc, realloc를 이용한 유동 메모리 할당

malloc와 calloc의 함수 원형은 다음과 같다. void * malloc ( size_t size ); void * calloc ( size_t num , size_t size ); malloc는 할당할 메모리 크기를 바이트 단위로 전달받고, 할당된 공간의 값들은 바꾸지 않는다. calloc는 메모리 크기를 두 값으로 나누어 전달받으며, 할당된 공간의 값을 모두 0으로 바꾼다. 그래서 배열을 할당하고 모두 0으로 초기화해야 할 때는 calloc를 쓰면 편하다. 아래 세 문장은 int형 변수를 배열처럼 5개씩 할당하는 예이다. n = ( int *) malloc ( 5 * sizeof ( int ) ); n = ( int *) calloc ( 5 , sizeof ( int ) ); n = ( int *) calloc ( 1 , 5 * sizeof ( int ) ); 여기서 'sizeof(int)'는 int형 변수가 차지하는 메모리 크기를 바이트 단위를 반환해 준다. 메모리 공간을 할당하는 점은 세 문장이 모두 같고, calloc가 할당된 공간의 값들을 0으로 채운다는 점이 다르다. 두째, 세째 문장은 수행 결과가 똑같다. 이미 할당한 공간의 크기를 바꿀 때에는 realloc를 쓴다. void * realloc ( void * memblock , size_t size ); realloc는 재할당한 뒤에 새로 할당된 메모리 주소를 반환한다. 기존에 있던 배열의 자료는 그대로 유지하면서 배열 길이를 늘릴 수 있다. 다음은 malloc로 배열크기를 5으로 할당하여 숫자를 채우고, realloc로 배열 크기를 10로 늘려서 숫자를 추가하는 예제이다. #include <stdio.h> #include <stdlib.h> void main () { int * ar , size , i ; size = 5 ; ar = ( i