No Reason2009. 5. 25. 01:49
Starsailor - Alcoholic


RHCP - Otherside


Nell - Good Night


ACDC - Back In Black


ACDC - It's long way(If wanna rock'n roll)


Dio - We Rock


촬영은 준수형님께서 수고해주셨습니다.^0^

'No Reason' 카테고리의 다른 글

노리즌 9/3 일의 연습곡 목록.  (0) 2009.08.30
090528  (0) 2009.05.28
5월 16일의 공연이 끝난뒤  (0) 2009.05.25
No Reason(3/30 합주곡)  (1) 2009.03.30
Posted by 태씽
No Reason2009. 5. 25. 01:19
좋았던 점

1. 공연은 역시 즐겁게 해야..... 상당히 즐겁게 했다.

2. 내가 공연을 하던 중 가장 내가 만족스러웠던 공연 처음으로(?) 마음의 평온을 가지고 공연을 즐기게 되었다.

3. 여러 장르의 음악을 부를 수 있었던 것이 나에게는 상당히 보컬적이나 음악적인 측면에서 많은 도움이 되었다.

4. 발성적인 측면에서 상당히 만족 할 수 있게 되었다.


나빳던 점

1. 단조로웠던 액션이 공연을 지루하게 했었다. 역시 장르가 다르면 역시 몸짓도 그에 따라야 하는것인가?

2. 여러 장르를 넘나들기에는 역시 아직 기술적으로 많이 부족하다는것을 느꼈다.

3. 체력이 너무 부족했다. 10곡 부르는데 후반에 가면 역시 힘들었다. 아무리 여유로웠다지만 공연은 어느정도 긴장감을 가지고 하기 때문에 체력이 평소보다 소모가 많이 된다.

4. 의상, 맘에 안들었고 선글라스, 맘에 안들었고, 머리 왁스, 역시 나에게 어울리지 않고, 다음에는 안경을 사서 하나 끼고 하지 선글라스는 끼지 말아야겠고, 옷차림도 약간 화사하게 가는것이 좋을것 같다.


깨달은 점

1. 장르를 일관성 있게 가는것이 좋겠다기 보다 그렇게 해볼 필요성이 있다. 밴드가 이제 슬슬 색깔을 찾을때가 되지 않았을까?

2. 음악 공부가 필요하다. 곡을 만들려는 의도도 있지만 곡의 이해에도 많은 도움이 된다.



'No Reason' 카테고리의 다른 글

노리즌 9/3 일의 연습곡 목록.  (0) 2009.08.30
090528  (0) 2009.05.28
5월 16일 공연동영상 토막들  (1) 2009.05.25
No Reason(3/30 합주곡)  (1) 2009.03.30
Posted by 태씽
컴퓨터/프로그래밍2009. 5. 15. 01:52
원래는 원격제어와 같은 원리의 프로그램을 개발 할려고 하였으나,, 팀원들간의 시간 조정이 맞지 않아 단순히 아프리카와 같은 원리의 프로그램을 개발 하게 되었다.

구성은 방송서버, 중계서버, 클라이언트(PC, Moblie)이 있고

방송서버는 말그대로 방송을 하는 서버이다. WMEncoder sdk를 이용하여 C#으로 작성하였는데 방송을 시작하게 되면 중계서버에 방을 만든다는 메시지를 보내고 서버에게 방송 URL을 넘겨 주게 된다. 그리고 방송서버 자신은 자신의 PC화면을 영역만큼 녹화하여 스트리밍하게 되는 원리이다.

중계서버는 Unix기반의 서버이고, 방송서버로 부터 받은 방목록, 방송 URL등을 클라이언트에게 전달해주는 역활을 하고 또한 클라이언트는 이것을 받아서 방송을 플레이하고, 또한 같은 방끼리 있는 클라이언트끼리의 메시지를 서버를 통해 서로 전달한다.


Posted by 태씽
음악2009. 5. 15. 00:10

어제는 술을 먹고 해서 빅마마를 못봤지만 오늘은 밴드들이 많이 나온다고 그래서 꼭 가고 싶었다.

정말 훌륭한 라인업들이 많이 나왔는데 좀 새로운 음악들을 많이 접할 수 있어서 좋았던거 같다.^^

아 젤첨의 펑크 밴드 이름이 기억이 안나는데 그이후로는 검정치마, 갤럭시익스프레스, 킹스톤루비스카, 윈디시티

특히 검정치마의 음악이 신선했다. 


Posted by 태씽
잡담2009. 5. 13. 01:26
이전에는 전혀 하지 않았던 시도들을 오히려 WM 공기계를 사게 되면서 많이 하게 된다.

오히려 재미있는 도전이지 않을까?


그와 동시에 음악 파일 자동으로 변환을 주제로 기초부터 다시시작하자. 나는 아직 많이 부족하다. 그러므로 끝없는 노력이
필요하다. 조금씩 변해가고 있다.

더이상 잃을게 없기 때문이다.

'잡담' 카테고리의 다른 글

최근  (0) 2009.06.06
웃기지 않니? 정말 이 상황이?  (0) 2009.05.29
to do보다 did  (2) 2009.05.07
정보처리기사 등록  (0) 2009.04.23
윈도설치후  (0) 2009.04.22
Posted by 태씽
잡담2009. 5. 7. 15:21

to do 리스트 보단 did 리스트를 쓰기로 생각을 했다.

앞으로 할일을 적다보면 끝없이 많이 할 수 있을거라고 생각을 하지만 실제로 그것을 다 하지는 못한다. 하지만 한일들을 보면서 그것밖에 못했는가 하는 반성을 하게 되면 훨 씬더 낳아질 수 있을 거라고 생각을 했기 때문이다.

물론 이것은 바로 바로 확긴 할 수 있는 아날로그식이 더좋겠지. 바로 시작한다.

'잡담' 카테고리의 다른 글

웃기지 않니? 정말 이 상황이?  (0) 2009.05.29
RSS 클리핑 프로그램 설치, WM5 SDK 로 개발  (0) 2009.05.13
정보처리기사 등록  (0) 2009.04.23
윈도설치후  (0) 2009.04.22
Wish list  (3) 2009.04.18
Posted by 태씽

(1) 주어진 파일을 Copy 하는 프로그램을 작성하되, copy SIGINT SIGQUIT을 받아도 죽지않고 COPY를 모두 마치닣후 종료하는 프로그램을 작성하라.

주어진 파일을 카피하는 과정이야 어떤 파일명을 받아서 그파일을 바이너리로 읽어 그대로 다른 파일명으로 써주면 된다. 쉽게 할 수 있는 과정인데 이꽈제는 SIGINT SIGQUIT의 기능을 먼저 이해를 해야 한다.

유닉스에서는 signal.h 헤더파일에 정의된 시그널 이름들이 있는데 그중에 SIGINT, SIGQUIT이 있다


#define SIGINT :
인터럽트를 위한 시그널로 유저가 인터럽트를 발생시키는 키를 입력했을 때 그와연결된 프로세스에세 커널이 보내는 시그널이다. 이 시그널은 프로세스를 종요할 때 많이 사용되는 시그널이다.이것은 터미널에서 ctrl+c와 같은 역활을 한다.

#define SIGQUIT : Quit
를 위한 시그널로 유저가 터미널에서 Quit키를 치면 커널이 프로세스에게 SIGQUIT 시그널을 보낸다


그러면 C언어상에서 이들 시그널을 어떻게 이용을하는가 하는것에 대한 궁금증이 생길텐데 한번 예제코드를 이용해서 살펴보도록하자.

signal()
이라는 함수가 있는데 이 함수는 이름그대로 시그널을 처리하는 함수 이다. signal 함수는 다음과 같이 나타낼 수 있다.

 int sigkind;
int function();
signal(sigKind, function);


여기서 sigKind에 바로 SIGINT, SIGQUIT같은 것이 들어가는것이다.
그리고 function sigKind의 함수가 호출 되었을때 실행되는 함수 이다
.

이제 이 signal함수를 이용해서 간단한 코드를 작성해 보자

 

 #include<stdio.h>
#include<signal.h>

int handler()
{

//필요한 작업을 처리한후에 프로그램을 종요한다.
printf("\n\nSIGINT
핸들러 호출
\n");
printf("\n<<
작업 종료 시작
>>>\n");
sleep(1);
printf("\n\n
실행되는 모든 프로세스 종료
\n\n");
printf("All open file closed\n\n\n");
exit(1);

}

int main()
{

int result, step =0;
//signal
함수를 사용하여 SIGINT 핸들러와 SIGQUIT핸들러를 등록한다.
printf("signal
함수를 사용하여 SIGINT 핸들러를 SIGQUIT핸들러를 등록한다
.\n\n");
result = signal(SIGINT, handler);
result = signal(SIGQUIT, handler);

//
무한루프 프로그램을 돌린다
.
printf("
메인 프로세스 실행
.\n");
while(1)
{

step++;
printf("%d
번째 작업 수행\n", step);
sleep(1);

}
return 1;

}




위의 코드를 실행하면 무한 루프대로 작업수행 메시지가 뜰것이고 시그널이 들어오면 핸들러 함수가 동작 하고 프로그램이 종료가 될 것이다. 실행을 시켜보자. 프로그램 실행도중 ctrl + c 또는 ctrl + \ 키를 눌러보자.

 ktss1023@ktss1023-desktop:~/바탕화면$ ./a.out
signal
함수를 사용하여 SIGINT 핸들러를 SIGQUIT핸들러를 등록한다
.
 
메인 프로세스 실행
.
1
번째 작업 수행

2
번째 작업 수행
3
번째 작업 수행


SIGINT
핸들러 호출

<<
작업 종료 시작>>>


실행되는 모든 프로세스 종료


All open file closed



다음과 같이 잘 실행이 될 것이다.

그런데 이것으로는 과제의 내용에 합당하는 문제를 풀수가 없다. 그러면 어떤 시그널이 들어올때 그시그널을 미리 block을 시킬수 있는 함수가 있다면 좋을 것이다. 바로 그것이 문제를 해결 하기위한 함수이다. 어떤함수가 있는지 한번 살펴 보자.

int sigemptyset(sigset_t * set)

set 이 가리키고 있는 시그널 집합을 초기화 한다.

성공시에 0 return 하고, 실패시에 -1 return 한다.

int sigaddset(sigset_t * set, int signum)

set 이 가리키고 있는 시그널 집합에 signum을 추가한다.

성공시에 0 return 하고, 실패시에 -1 return 한다.

int sigdelset(sigset_t * set, int signum)

set 이 가리키고 있는 시그널 집합에 signum을 삭제한다.

성공시에 0 return 하고, 실패시에 -1 return 한다.

int sigprocmask(int how, const sigset_t * set, sigset_t * oldset)

시그널 마스크를 검사하고 변경하기 위해서 사용된다. 간단히 말해서 해당 시그널에 대해서

BLOCK, UNBLOCK 를 하기 위해서 사용한다.

 

how option

SIG_BLOCK

새로운 시그널 마스크는 현재의 시그널 마스크와 set에 의해 지정된 시그널 마스크의 합집합이다.

, set는 블록 시키고자 하는 추가적인 시그널들을 포함한다.

SIG_UNBLOCK

새로운 시그널 마스크는 현재의 시그널 마스크와 set로 지정된 시그널 마스크의 보수의 교집합이다.

, set는 블럭에서 해제시킬 시그널들을 포함한다.

SIG_SETMASK

새로운 시그널 마스크는 set로 지정된 시그널 마스크이다.

시그널 마스크를 변경하였다가 이전 시그널 마스크로 복귀시키고자 할 때, 원래의 시그널 마스크를

저장하였다가 SIG_SETMASK 옵션을 사용해야 한다

sigprocmask 는 성공시에 0 return 하고, 실패시에 -1 return 한다.


바로 이런 함수이다. sigset_t * set 집합을 하나 선언하고 집합에 SIGINT, SIGQUIT을 추가 한뒤int sigprocmask(int how, const sigset_t * set, sigset_t * oldset) 함수를 이용해서 SIG_BLOCK을 해주면 된다.

문제를 풀기 전에 이 함수를 이용해서 아까의 프로그램을 약간 변형하는 형태의 프로그램을 작성해보자.

 

 #include<stdio.h>
#include<signal.h>

int main(void)
{
int result, step =0;
sigset_t* set, oldset, pendset;//BLOCK
signal set의 변수를 선언,

//
셋을 초기화 시킨다
.
if(sigemptyset(&set)<0)
{
printf("sigemptyset error\n");
exit(1);
}

//
블록할 시그널 등록

if(sigaddset(&set, SIGINT)<0)
{
printf("sigaddset error\n");
exit(1);
}

//
블록할 시그널 등록
if(sigaddset(&set, SIGQUIT)<0)
{
printf("sigaddset error\n");
exit(1);

}

//
시그널 블록을 해준다.
printf("
시그널 블록 시작
\n\n");
printf("5
초만기다려봐
\n");
if(sigprocmask(SIG_BLOCK, &set, &oldset)<0)
{
printf("
블록 에러
");
exit(1);
}



sleep(5);

if(sigpending(&pendset)<0)
{
printf("sigpending error");
exit(1);
}

if(sigismember(&pendset, SIGINT)||sigismember(&pendset, SIGQUIT))
{
printf("
작업이 진행중이다
.\n");
}


//
무한루프 프로그램을 돌린다
.
printf("
메인 프로세스 실행
.\n");
while(1)
{
step++;
printf("%d
번째 작업 수행
\n", step);
sleep(1);
if(step==20)break;

}


if(sigprocmask(SIG_SETMASK, &oldset, NULL) <0)
{
printf("unblock error");
exit(1);
}
printf("SIGQUIT,SIGINT
가 언블록되었다
\n\n");


return;
}



위의 프로그램은 처음 5초간 기다리면서 신호를 받아 그신호가 SIGINT, SIGQUIT이면 메시지를 출력할려고 그랬는데 이걸지속적으로 할려면 타이머나 스레드를 돌려서 해야 될 듯 하다. 그리고 sigprocmask 함수를 이용해서 SIGINT,SIGQUIT의 신호를 막았다. 그러므로 실행하면 작업이 끝나기전에는 신호가 블록이 되어 동작하지 않는다.
자 그렇다면 이제 위를 토대로 문제를 해결하면 된다. 작업에 파일을 복사하는 작업을 하면 되는것이다. 처음에 폴더내에있는 파일명들을 출력해주고 파일명을 입력 받고 복사해주면 되는 형식으로 작성을 해보자.

#include<stdio.h>
#include<signal.h>
#include<fcntl.h>

#define LENGTH 256

static void sig_int(int);

int main()
{
char filename[LENGTH];//
파일이름은 100자를 초과할 수 없다.

char c_filename[LENGTH];//
복사할 파일 이름


char buf[LENGTH];//
버퍼


int result= 0;
int readCnt, writeCnt, orgFile, newFile;

sigset_t* set,oldset;//BLOCK
signal set의 변수를 선언,    

//
복사할 파일 오픈

printf("
복사할 파일 이름을 입력하시오 : ");
scanf("%s",filename);
orgFile = open(filename, O_RDONLY);

if(orgFile<0)
{
    printf("
없는 파일입니다
.\n");
    return -1;
}

//
복사 당할 파일 생성

printf("
생성할 파일 이름을 입력하시오 : ");
scanf("%s",c_filename);
newFile = open(c_filename, O_WRONLY|O_CREAT|O_APPEND);

if (signal(SIGINT, sig_int) == SIG_ERR)
{
printf("signal error\n");
return -1;
}
if (signal(SIGQUIT, sig_int) == SIG_ERR)
{
printf("signal error\n");
return -1;
}

//
셋을 초기화 시킨다
.
if(sigemptyset(&set)<0)
{
printf("sigemptyset error\n");
return -1;
}

//
블록할 시그널 등록

if(sigaddset(&set, SIGINT)<0)
{
printf("sigaddset error\n");
return -1;
}

//
블록할 시그널 등록
if(sigaddset(&set, SIGQUIT)<0)
{
printf("sigaddset error\n");
return -1;

}

//
시그널 블록을 해준다.



/*
sleep(5);

if(sigpending(&pendset)<0)
{
printf("sigpending error");
exit(1);
}

if(sigismember(&pendset, SIGINT)||sigismember(&pendset, SIGQUIT))
{
printf("
작업이 진행중이다
.\n");
}
*/
printf("
시그널 블록 시작
\n\n");
if(sigprocmask(SIG_BLOCK, &set, &oldset)<0)
{
printf("
블록 에러
");
return -1;
}


//
프로그램을 돌린다
.
printf("
복사 시작
!\n");

for(readCnt=1;readCnt>0;)
{

    readCnt = read(orgFile, buf, LENGTH);
    writeCnt = write(newFile, buf, LENGTH);
    
    /*
    step++;
    if(step%2==0)
    {
        printf("1
초만쉬어요
.\n");
        sleep(1);
    }
*/
    printf("%d, %d\n", readCnt, writeCnt);


}

printf("SIGQUIT,SIGINT
가 언블록되었다
\n\n");
}

printf("
복사끝
\n");

close(orgFile);
close(newFile);

if(sigprocmask(SIG_SETMASK, &oldset, NULL) <0)
{
printf("unblock error");
return -1;
}

static void sig_int(int signo)
{
    printf("
신호확인
\n");
    return;
}

하지만 이코드로는 왠일인지 파일 복사가 진행이 되지 않는다. 대체 무슨 연유일까? 이것만으로는 해결하기가 어렵다는 결론으로 sigaction이라는 함수를 찾아 보았다.

sigaction()

sigaction은 시그널을 취급할 방법을 선택 할 수 있다.

헤더파일

#include <signal.h>

원형

int sigaction(int signo, const struct sigaction *act, struct sigaction *oact);

인자

첫번째 : 행동을 지정할 개개의 시그널

두번째 : 지정하고 싶은 행동

세번째 : 나중에 복구를 위해 현재 값을 저장한다.

다음과 같이 시그널의을 취급하는 방법을 선택하는 함수이라고 하는데.
일단, sigaction 구조체에 대해서도 알아봐야 할 것이다.

struct sigaction {
    void (*sa_handler)(int);
    void (*sa_sigaction)(int, siginfo_t *, void *);
    sigset_t sa_mask;
    int sa_flags;
    void (*sa_restorer)(void);
}
sa_handler

signum번호를 가지는 시그널이 발생했을 때 실행된 함수를 설치한다. 함수외에도 SIG_DFL SIG_IGN을 지정할 수 있다. 전자는 시그널에 대한 기본행동을 후자는 시그널을 무시하기 위해서 사용한다.

sa_mask 

sa_handler에 등록된 시그널 핸들러 함수가 실행되는 동안 블럭되어야 하는 시그널의 마스크를 제공한다. SA_NOMASK가 적용되어 있지 않다면

sa_flags 

시그널 처리 프로세스의 행위를 수정하는 일련의 플래그들을 명시한다. 다음중 하나 이상의 것들에 의해서 만들어 진다.

SA_NOCLDSTOP 

만약 signum SIGCHLD라면, 자식 프로세스가 SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU등을 받아서 중단되었을 때 이를 통지 받을 수 없게 된다.

SA_ONESHOT, SA_RESETHAND

일단 시그널 처리기가 호출되면, 기본 상태에 대한 시그널 액션을 재 저장한다. 이는 signal(2)호출에 대한 기본 행위이다.

SA_RESTART 

일부 시스템 호출들이 시그널을 통해 재시작할 수 있도록 함으로서 BSD 시그널과 호환되도록 한다.

SA_NOMASK, SA_NODEFER

시그널이 자체 시그널 처리기로부터 수신 받지 않도록 한다.

SA_SIGINFO 

시그널 처리기가 하나가 아닌 3개의 인자를 취할경우 sa_handler대신 sigaction siginfo_t를 이용할 수 있다. siginto_t는 다음과 같이 정의된 구조체이다.

[

 

다음과 같은 구조체를 지니는데 각구조체의 역확은 예제 코드에서 알아보자.

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

---------------------test.c----------------------------

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

//sigaction() 사용하기
//
시그널을 취급할 방법을 선택할 수 있다.
#include <stdio.h>
#include <signal.h>
//sigaction()

int main(void)
{
 static struct sigaction act;
//행동을 지정할 구조체

 void catchint(int); //행동할 함수(함수를 바꿈으로 인터럽트시 행동을 조절 할 수 있다.)

 act.sa_handler = catchint; //구조체 변수에 취해질 행동을 지정한다.
 
 sigfillset(&(act.sa_mask));
//시그널을 포함하도록 집합을 완전 채운다.(?)
 
 //SIGINT : 인터럽트를 프로세스에게 보낸다.
 //&act
지정된 행동
 //
현재값은 0으로(나중에 복구하기 위해 지정할 수 있다.)
 sigaction(SIGINT, &act, NULL);
 
 //프로세스 실행
 printf("sleep call #1\n"); sleep(5);
 printf("sleep call #2\n"); sleep(5);
 printf("sleep call #3\n"); sleep(5);
 printf("sleep call #4\n"); sleep(5);

 printf("Exlting\n");
 exit(0);
}

//실행 함수
//
인터럽트를 칠때 커널에 의해 프로세스에게 보내진다.
void catchint(int signo)
{

 printf("\nCATCHINT : signo = %d\n", signo);
 printf("CATCHINT : returning\n\n");
}

==================================================================


다른 블로그의 글을 퍼온 코드인데 이해 하기가 쉬울것이다. 그러니까 sigaction signal 함수를 좀더 발전? 시킨것이다. 이를 토대로 코드를 한번 작성해보자.

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

#define LENGTH 256

void sigcatch(int); //
행동할 함수(함수를 바꿈으로 인터럽트시 행동을 조절 할 수 있다.)

int main(void)
{
    char filename[LENGTH];//
파일이름은 100자를 초과할 수 없다
.

    char c_filename[LENGTH];//
복사할 파일 이름


    char buf[LENGTH];//
버퍼

    int result= 0;
    int readCnt, writeCnt, orgFile, newFile;

    static struct sigaction act; //
행동을 지정할 구조체
    
    act.sa_handler = sigcatch; //
구조체 변수에 취해질 해동을 지정한다.
 
    sigfillset(&(act.sa_mask)); //sigaction
구조체의 sigset을 모든 신호를 다 채운다
.
    //
이는 sigaddset함수를 이용해 SIGINT SIGQUIT만 선택해도 된다
.
    act.sa_flags = 0;
   
    //SIGINT :
인터럽트를 프로세스에게 보낸다
.
    //&act
지정된 행동

    //
현재값은 0으로(나중에 복구하기 위해 지정할 수 있다.)
    if(sigaction(SIGINT, &act, NULL)==-1)
    {
        perror("sigaction error\n");
    }
    if(sigaction(SIGQUIT, &act, NULL)==-1)
    {
        perror("sigaction error\n");
    }
    //


    //
복사할 파일 오픈

    printf("
복사할 파일 이름을 입력하시오 : ");
    scanf("%s",filename);
    orgFile = open(filename, O_RDONLY);
    
    if(orgFile<0)
    {
        printf("
없는 파일입니다
.\n");
        return -1;
    }
    
    //
복사 당할 파일 생성

    printf("
생성할 파일 이름을 입력하시오 : ");
    scanf("%s",c_filename);
    newFile = open(c_filename, O_WRONLY|O_CREAT|O_APPEND);


    //
프로그램을 돌린다
.
    printf("
복사 시작
!\n");

    for(readCnt=1;readCnt>0;)
    {
        readCnt = read(orgFile, buf, LENGTH);
        writeCnt = write(newFile, buf, LENGTH);
    
           /*
             step++;
            if(step%2==0)
            {
                printf("1
초만쉬어요
.\n");
                sleep(1);
            }
        */
        printf("%d, %d\n", readCnt, writeCnt);

    
    }

    printf("
복사끝
\n");

    close(orgFile);
    close(newFile);
}

//
실행 함수

//
인터럽트를 칠때 커널에 의해 프로세스에게 보내진다.
void sigcatch(int signo)
{

 printf("\nsigno = %d
신호가 들어왔습니다
.\n", signo);
 printf("
파일 복사가 진행중입니다.\n\n");

}

단순히 텍스트 파일 복사를 시험하였고 복사가 빨리 진행되므로 255바이트 마다 1초간 sleep함수를 실행했다.
결과는




(2) alram() SIGALRAM을 사용하여 timeout을 가지고 file read하는 함수를 작성하시오.

일단 alarm() SIGALRM에 대해서 알아 보아야 할것이다. 우선 alarm함수는 시그널을 전달하기 위해서 사용하는 함수로 전달되는 시그널이 SIGALRM이다.

alarm seconds 초 후에 프로세스에 SIGALRM 을 전달한다. 만약 seconds 0이라면 결코SIGALRM 이 전달되지 않을것이다. 만약 alarm 이 여러개 쓰인다면 기존에 설정되었던 alarm 설정값은 취소되고가정최근의 alarm 설정값으로 지정된다.

그러므로 alarm 을 사용할때는 alarm 이 겹치지 않도록 주의해야 한다.

SIGALRM 의 기본 행동은 프로세스 종료이다.

이렇게 나와 있는 예제프로그램을 한번 보자.

#include <unistd.h>
#include <signal.h>

void myalarm()
{
   
printf("ding dong dang\n");
}

int main()
{
   
printf("alarm setting\n");
    // SIGALRM
이 발생하면 myalarm() 함수를 실행한다.
   
signal(SIGALRM, myalarm);
    //
알람을 1초로 설정한다.
   
alarm(1);
  

 while(1)
    {
       
printf("ok\n");
        //
신호를 기다린다.
       
pause();
        // alarm
2초로 설정한다.
       
alarm(2);
    }
}

다음과 같이 signal 함수를 이용해서 SIGALRM이 발생할 경우 myalarm함수가 발생하도록 했다.
위코드를 토대로 타임아웃을 주는 파일을 리드하는 프로그램을 작성하자. 읽은 파일은 화면에 출력하는것으로 한다.

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

void myalarm()
{
    printf("\n
파일리드를 종료합니다.\n");
    exit(0);
}

int main()
{
    FILE *fp;//
리드할 파일포인터

    char f_name[200];//
파일이름
    char buf;//1
바이트짜리 버퍼
    int limit;//alarm
의 수를 결정

    printf("
읽을 파일이름을 입력하세요 : ");
    scanf("%s",f_name);
    
    if(!(fp = fopen(f_name,"r")))
    {    
    printf("
파일이 잘못되었습니다
.\n");
    return -1;
    }    

    printf("
몇초후 타임아웃하실건가요
: ");
    scanf("%d",&limit);

    signal(SIGALRM, myalarm);
    
    alarm(limit);
    printf("alarm setting\n");
    // SIGALRM
이 발생하면 myalarm() 함수를 실행한다
.
   

    while(!feof(fp))//
파일은 1바이트씩 읽고 출력한다
.
    {
        printf("%c",fgetc(fp));
        sleep(1);
    }
    return 0;    
}

위 프로그램은 미리 alram을 설정하고 그동안 1바이트씩을 읽고 출력한뒤 sleep(1)을해주는 프로그램으로 20초동안만 파일을읽고 출력이 된다.

 

 

 

'CSE(컴퓨터 공학) > 유닉스 시스템' 카테고리의 다른 글

유닉스 과제 #4  (0) 2009.05.30
유닉스 과제2  (0) 2009.04.08
Posted by 태씽
컴퓨터/하드웨어2009. 4. 25. 01:18

집의 컴퓨터 사양이 대략

P4 3.0G
512M
Geforce FX5200
160G 하드
거기다가 오래된 윈도우.. 너무 버벅되게 되어 버렸다.

난 원래 하나의 물건에대해 애정을 쏟아 붙는편이다. 좀 오래쓰고 싶어하고 특히 컴퓨터는 계속 최적화를 시켜주고 이러는데 최근의 나는 그러질 못했는지 컴퓨터가 거의 맛이갔었다. 결심을하고 80기가에 달하는 음악파일을 백업시킨후 드디어 윈도우를 다시깔았다.(원래 파티션도 나누지 않았었지만 이번엔 데이터관리를 열심히 하기 위해 파티션도 나누고..)

어쨋든 본론은 포맷하고 컴퓨터가 상당히 최적화 되고 이런 컴에서도 상당히 잘버터주지만 그래도 약간의 버벅임은 어쩔 수 없다고 생각하고 램을 하나 구입했다. 뭐 중고 외산램이지만 가격이 착하다. 하지만 DDR2 였으면 그돈으로 1기가를 샀을텐데..
램을 많이 사고 싶었지만 슬림컴퓨터의 한계, 램슬롯이 2개... 결국 512하나로 만족해야 했다. 그리고 결국 오늘 램이 왔는데 사실 옛날부터 컴에 램을 추가로 많이 달아봤지만 이번처럼 성능차이를 확실히 느낀것은 처음인거 같다. 역시 윈도우 XP라도 운영체제가 먹고들어가는 메모리 용량이 꽤되었던거 같고 1기가로 올라간 램은 확실히 하드스왑을 많이 줄여주었다. 대표적으로 쇼핑몰! 이거뭐 옛날에는 그림읽어 오는게 너무 힘들었는데 지금은 별 무리가 없다. 이정도로도 만족한다.^.^ 내일은 그래픽 카드도 오니까..정말 컴퓨터 오래쓰는거 같다. 끝까지 우려먹는듯한 느낌? 사실 다른사람들에게는 하찮은 사양이겠지만 아직 나에게는 사랑스러운 메인컴퓨터고 좀더 버텨주어야 한다고 생각한다. 좀더 버텨!

일단 업그레이드 확인 정보



램 인증샷!

Posted by 태씽
물건들2009. 4. 23. 21:30

이것이 무엇이냐.

바로 건반이다. 건반인데 사진으로 딱보기에도 이게 뭔가 부실하다는 생각이 들지 않는가. 이건반은 보기에도 실제 건반이라는 생각이 들지 않을 것이다. 그렇다. 바로 터치기반(터치라고 하기에도 뭐하다.)의 건반인다. 자 이것이 어떻게 동작할까?
컴퓨터에는 보면 사운드카드가 있고 사운드 카드에는 아무리 싸도 미디을 재생할 수있는 능력이 있다. 나의 데스크탑은 내장 사운드 카드 이지만서도 다음과 같이 미디장치가 있다.
미디가 뭔가 하고 궁금할 수도 있는데 이것은 쉽게 말해서 사운드카드에 다양한 음원들을 재생하거나 하게 만들 수 있는 것이다.(맞는지 모르겠다.)

어쨋든 MIDI장치로 인해서 어떤입력장치(대표적으로 키보드)에 의해서 악기처럼 여라가지 악기를 재생할 수가 있다. 그러므로 입력 장치를 저 PPR2000이라는 건반으로 하고 거기에 맞는 프로그램을 제작 해서 판매를 하는 회사가 있었나보다. 2000이라는 숫자가 있는걸 보면 2000년도가 아닐까? 어쨋든 최근에 건반을 좀 치고는 싶은데 돈이없어서 어쩌지 하면서 검색하다 나온것이 바로 저 제품이다. 9900원을 줬던 기억이나는데 막상 상품정보를 찾을려니 G마켓이랑 옥션 둘다 없네..


위와 같은 프로그램을 실행하면 악기를 재생할 수 있는 환경이 주어지고 건반에 맞게 연주를 하면 그음이 그대로 스피커를 통해서 흘러나오게 된다. 127개의 음원들이 있고 옥타브, 볼륨 조절, 프로그램 환경에 맞는 악보 파일도 재생할 수가 있다. 하지만 이상하게도 악보를 제작할 수도 없고 녹음을 할 수 있으나 규격에 맞지않는 자기네들만의 파일이기 때문에 그냥 다른 녹음파일을 쓰는것이 더 낳을 것이다.

소리에 대해서 이야기 하자면 소리 자체는 매우 허접하다. 뭐 사운드카드의 문제일 수도 있지만 기본적으로 프로그램도 부실하다. 그렇지만 만원도 안되는 가격에 건반을 연주하고 싶다는 생각을 하는 사람들에게는(나같은) 매력적이지 않을 수가 없다. 이제 걸음마를 때려하는 사람에게는 그에 걸맞는 수준의 도구가 있어야 하니까 말이다.

또 한가지의 문제라면 바로 건반의 터치감이다. 아무래도 실제건반을 누르는 방식이 아니고 터치하는 방식이기 떄문에 실제 건반을 연주할때와는 완전히 다른 느낌이라는 것이다. 아무래도 이점이 더 크겠지. 역시 싼거는 싼거만큼의 능력을 보여준다고 생각하지만 그 싼 물건에도 능력은 있다, 그능력을 이끌어 내는것이 사람아니겠는가. 앞으로 나와 함께 열심히 음악 공부를 할 PPR2000에게 박수를~ 짝짝짝!


'물건들' 카테고리의 다른 글

안녕. 엑스페리아 X1  (0) 2010.08.27
Posted by 태씽
잡담2009. 4. 23. 14:15
오늘했고

시험은 5월 10일(일) 이날 잊지말고 시험 치자.

'잡담' 카테고리의 다른 글

RSS 클리핑 프로그램 설치, WM5 SDK 로 개발  (0) 2009.05.13
to do보다 did  (2) 2009.05.07
윈도설치후  (0) 2009.04.22
Wish list  (3) 2009.04.18
그냥 아무 생각없이 쓰는 리스트  (0) 2009.04.04
Posted by 태씽