'develop/dogvelop'에 해당되는 글 11건

  1. 2006.12.15 mingw + eclipse로 windows에서 개발하기
  2. 2006.12.11 [리눅스]메세지 큐를 이용한 serial & key & timer check
  3. 2006.12.09 [Linux] key & serial 멀티 프로세서로 처리하기
  4. 2006.11.29 [리눅스] sleep & usleep
  5. 2006.08.22 [리눅스] 현재 시간을 자신이 원하는 포맷으로 출력하기
  6. 2006.08.21 프로세스 찾아서 지우고 실행하기
  7. 2006.08.21 데몬 프로그램 만들기
  8. 2006.06.29 Arm Assemble
  9. 2006.06.28 API & SDK
  10. 2006.06.23 u-boot 상에서 irq로 led테스트

mingw + eclipse로 windows에서 개발하기

Eclipse C/C++ 개발환경 갖추기(2002.10.1)

JLab 편집실 전지원(meeky)

Eclipse C/C++ 개발환경 갖추기

Eclipse의 본래 목적은 java뿐만 아니라 모든 언어의 통합개발을 할 수 있는 IDE를 만들자는 것이었습니다. 아직은 java개발환경 지원이 활발하지만 C/C++, Delphi, Pascal등 다양한 언어를 지원하는 IDE Tool이 개발 중에 있습니다.  java 개발환경을 Eclipse에서 JDT라고 하는 것 처럼, C/C++ 개발 환경인 CDT가 개발 중에 있습니다. 아직 1.0 version이 나오지 않았지만 개발버전을 사용할 수 있습니다.  Eclipse를 이용하여 C/C++을 개발할 수 있는 환경을 만들고, 예제인 Hello World 프로그램을 작성해 보도록 하겠습니다.

1.먼저 CDT를 다운 받습니다.
CDT는 http://www.eclipse.org/cdt/ 사이트에서 Download를 클릭하고 날짜가 가장 최신인 버전을 다운 받으면 됩니다.




2.압축을 plugins과 features가 나옵니다. 두 폴더를 복사를 하여 eclipse 폴더아래 복사를 합니다. 저는 d:\elipse 폴더에 복사를 합니다.





3.이클립스를 실행하고, toolbar의 새로만들기 버튼을 눌러보면 C, C++ 프로젝트가 생성할 수 있는 메뉴가 있음을 볼 수가 있습니다.




4.프로젝트를 생성을 합니다.






5.프로젝트를 생성하면 오른쪽에 C/C++프로젝트 라는 Navigator가 보입니다. 프로젝트 폴더를 선택하고 오른쪽 버튼을 눌러 New>file 을 선택합니다.




6.파일명에 hello.c라고 입력합니다. 아래나오는 화면과 같이 C/C++ Editor에 입력합니다.




7.다시 프로젝트 폴더를 선택하고 오른쪽 버튼을 눌러 New/file을 선택합니다.



8.파일명에 makefile이라고 입력하면 파일이 생성됩니다. 오른쪽 Editor화면에 아래 화면과 같이 입력합니다.



9.다시 프로젝트 폴더를 선택하고 Build를 눌러봐도 아무런 일이 일어나지 않습니다. 이것은 C/C++ Compiler가 설치되어 있지 않아서 입니다. Visual C++을 쓸수도 있지만 GNU Compiler를 사용해 봅니다.


10.Windonws GNU 개발사이트 주소는 http://www.mingw.org/ 입니다. 다운로드는 http://sourceforge.net/project/showfiles.php?group_id=2435&release_id=38019 에서 다운 받습니다. 분홍색으로 하이라이트되어 있는 곳에 MinGW-2.0.0-3.exe를 다운 받습니다.

설치를 간단하므로 생략하겠습니다. 설치는 MinGW-2.0.0-3.exe더블클릭하고 나오는 지시를 그래도 따르면 됩니다. c:\MinGW폴더에 설치가 되었을 것입니다. MinGW-2.0.0-3.exe를 다운 받은 화면 아래 make-3.79.1-20010722.tar.gz파일도 다운 받아 압축을 풉니다. 압축을 풀어 나온 파일을 c:\MinGW\bin아래에 복사를 합니다.

환경변수에 c:\MinGW\bin을 Path에 추가를 합니다.


11.이클립스를 종료하고 다시 실행합니다. HelloWorld폴더를 선택하고 마우스 오른쪽 버튼 클릭한 후 Build를 실행합니다.



12.Compile되는 화면이 보이고 화면 하단에 C-Build 메시지가 보입니다. 화면과 같은 메시지는 warning이니 무시하셔도 됩니다만 화면에 나오는 메시지대로 hello.c파일 맨 마지막 "}"다음에 엔터를 하면쳐서 Newline을 만들어주면 warning메시지가 사라질것입니다.





13.hello.exe를 더블클릭하여 실행시켜 주십시오.


command 창에 Hello World가 보입니다. 엔터를 치면 command창이 사라집니다.


정말 간단한 예제를 만들어 보았습니다. 아쉽게도 저는 C/C++은 잘 모릅니다. 부디 C/C++ 잘 아시는 분께서 앞으로 Eclipse에서 C/C++개발을 많이 하셔서 Eclipse-java게시판 Eclipse-C/C++ 게시판이 만들어지고 Eclipse 사용이 활발해졌으면 좋겠습니다.


www.jlab.net

이 글은 정보 공유를 위해 쓰여 졌으며 JLab 정보 공유 약관을 지켜주시는 모든 곳에서 자유롭게 공유 하 실 수 있습니다. 오탈 자나 건의는 이곳에 해주십시오

[리눅스]메세지 큐를 이용한 serial & key & timer check

/**
 * 부모와 자식 프로세서로 나누고,
 * 부모프로세서에서는 시리얼로 부터 데이터를 받아 들이고,
 * 자식프로세서는 time out체크와, CANCEL키 체크를 하도록 했다.
 * 두 프로세서 간의 통신은 메세지 큐를 이용했다.
 *
 * 이 프로그램은 자식 프로세서에 걸린 timer가 지정된 시간을 초과시
 * 부모 프로세서에게 "TIMEOUT"메세지를 보내면, 부모 프로세서가 자식
 * 프로세서에게 SIGTERM을 보내서 자식 프로세서를 끝내고,
 * 부모 프로세서는 자식 프로세서가 종료 됐다는 것을 알게 되면(waitpid)
 * 프로그램을 종료 하도록 만들었다.
 */
#include "include.h"

#define MOL
#include "app_pub.h"
#include "app_def.h"
#include "app_func.h"

#define SIZE    10
#define KEY     1234

struct {
    long mtype;
    char data[SIZE];
} msg_data;/**< 메세지 큐에서 사용할 메세지 구조체*/


int main(void)
{
    struct pollfd Event;
    sigset_t set,oldset,pend;
    int pid,cnt,status,child,i,j;
    char kch;
    int msgid;/**< msgget()으로 가져온 메세지 큐의 id를 저장할 변수*/

    i = j = 0;
    
    if ((pid=fork()) < 0)
    {
        perror("fork() Error");
        exit(1);
    }

    if (pid)
    {   //parent
        // 부모 프로세서에서 메세지큐를 생성한다.
        // 메세지 큐를 만든다.(mode 0666)
        // 동일한 key의 메세지 큐가 있으면, 식별자만 반환(IPC_CREAT)
        if ((msgid = msgget((key_t)KEY,IPC_CREAT|0666)) == -1)
        {
            perror("msgget() Error");
            exit(1);
        }
        printf("parent msgid %d\n",msgid);

        sio_set(PRIVATE_PORT,B9600);

        memset(tempbuf,0,sizeof(tempbuf));
        rlen = 0;

        Event.fd = fd;
        Event.events = POLLIN | POLLERR;

        while(1)
        {
            child = waitpid(pid,&status, WNOHANG);
            cnt = poll((struct pollfd *)&Event,1,1000);
            if (cnt < 0)
            {
                perror("parent poll() Error");
                exit(1);
            }
            else
            if (!cnt)
            {
                printf("Parent %d\n",i++);
                // 1초마다.메세지 큐에 있는 메세지를 읽는다.
                // 메세지가 없으면, 기다리지 않고 -1을 리턴하고 넘어간다.
                // msg_data.mtype = 1인 것만 읽어온다.
                // msg_data.mtype 에 상관없이 맨 앞에것만 읽어온다.
                if (msgrcv(msgid,&msg_data,SIZE,0,IPC_NOWAIT) > 0)
                {   // 메세지가 있으면,
                    printf("msg_data mtype = %ld\n",msg_data.mtype);
                    printf("msg_data = %s\n",msg_data.data);
                    if (strstr(msg_data.data,"TIMEOUT"))
                    {
                        // 메세지 큐(msg_data.data)가 "TIMEOUT"인 경우에는
                        // 프로그램을 종료한다.
                        if (msgctl(msgid,IPC_RMID,0) == -1)
                        {
                            perror("child msgctl() Error");
                            release_timer();
                            exit(1);
                        }
                        printf("msgid(%d) Delete\n",msgid);
                        // child process에는 테스트를 위해 종료 부분을 뺐다
                        kill(pid,SIGTERM);
                    }
                }
                if (child>0)
                {
                    printf("Child Process Term\n");
                    exit(1);
                }
            }
            else
            if (cnt)
            {
                RCH = com_getc();
                tempbuf[rlen++] = RCH;
                printf("tempbuf[]>> \n");
                printf("%s \n",tempbuf);

            }
        }//while
    }//parent
    else
    {   //child
        // KEY를 갖도록 메세지큐를 생성 또는 기존에 있으면, 메세지ID(msgid)
        // 를 얻어온다.(기존에 메세지 큐가 있으면, 접근 모드는 무시된다.)
        if ((msgid = msgget((key_t)KEY,IPC_CREAT|0666)) == -1)
        {
            perror("child msgget() Error");
            exit(1);
        }

        keyhandle = open("/dev/key",O_RDWR);

        printf("child msgid %d",msgid);
        Event.fd = keyhandle;
        Event.events = POLLIN | POLLERR;

        sigemptyset(&set);
        sigaddset(&set, SIGALRM);
        sigprocmask(SIG_BLOCK,&set,&oldset);

        set_timer(10);
        while(1)
        {
            cnt = poll((struct pollfd *)&Event,1,1000);
            if (cnt < 0)
            {
                perror("child poll() Error");
                exit(1);
            }
            else
            if (!cnt)
            {
                printf("Child %d\n",j++);
                sigpending(&pend);
                if (sigismember(&pend,SIGALRM))
                {
                    //struct msgbuf에 type(long)값을 꼭 줘야 한다.
                    //(msgsnd()시, type에 값이 없으면, argument error가 난다.
                    msg_data.mtype = 1;
                    strcpy(msg_data.data,"TIMEOUT");
                    if (msgsnd(msgid,&msg_data,strlen(msg_data.data),0) ==-1)
                    {
                        perror("child msgsnd() Error");
                        release_timer();
                        exit(1);
                    }
                    release_timer();
                    // set_timer()의 타임아웃을 체크했으면,
                    // 시그널들을 원래대로 되돌린다.
                    sigprocmask(SIG_SETMASK,&oldset,NULL);
                }
            }
            else
            if (cnt)
            {
                kch = GetKey();
                if (kch == CANCEL)
                {
                    msg_data.mtype = 1;
                    strcpy(msg_data.data,"CANCEL");
                    if (msgsnd(msgid,&msg_data,strlen(msg_data.data),0) == -1)
                    {
                        perror("child msgsnd()2 Error");
                        exit(1);
                    }
                    //release_timer();
                    //exit(1);
                }                
            }
        }//while
    }//chile
}




[Linux] key &amp; serial 멀티 프로세서로 처리하기

fork(), signal, poll()을 사용한 프로그램이다.

/**
 * 멀티프로세서 프로그램 *
 * 부모 프로세서에서는 전용선(ttyS3)에서 데이터를 읽어오고(1byte)
 * set_timer()로 지정한 시간이 경과하면 자식프로세서를 종료시키고 종료한다.
 *
 * 자식 프로세서는 키입력을 받아오고, 종료(CANCEL)키가 들엉오면,
 * 부모프로세서에게 종료(SIGTERM)시그널을 보내고 종료한다.
 */
#include "include.h"
#define MOL
#include "app_pub.h"
#include "app_def.h"
#include "app_func.h"

int main(void)
{
    int pid,ppid, cnt,child,parent,status;
    struct pollfd Event;
    sigset_t set1,oldset,pend;
    if ((pid = fork()) < 0)
    {
        perror("fork() Error");
        exit(2);
    }
    else
    if (pid != 0)
    {   //parent
        sio_set(PRIVATE_PORT, B9600);
        Event.fd = fd;
        Event.events = POLLIN | POLLERR;
        //시그널 집합 set1을 비우고,
        sigemptyset(&set1);
        // SIGALRM만 추가한다.
        sigaddset(&set1, SIGALRM);
        // SIGALRM을 제외한 모든 시그널은 블록되고,
        // 기존의 시그널은 oldset에 저장한다.
        // 현재 프로시져 내의 모든 시그널에 영향을 미친다.(set_timer포함)
        sigprocmask(SIG_BLOCK,&set1,&oldset);
        memset(tempbuf,0,sizeof(tempbuf));
        rlen = 0;
        // setitimer()로 timeout 10초 설정
        set_timer(10);
        parent = 0;
        while(waitpid(pid, &status, WNOHANG)==0)
        {
            cnt = poll((struct pollfd *)&Event, 1, 1*1000);
            if (cnt < 0)
            {
                perror("poll() Error");
                exit(2);
            }
            else
            if (!cnt)
            {
                //poll()로 1초마다, 시그널을 체크한다.
                //블목화된 시그널 가져온다.
                sigpending(&pend);
                // set_timer()는 지정한 시간이 초과되면,
                // SIGALRM 시그널을 발생시킨다.
                // sigismember()로 pend에 있는 가져온 시그널을 체크
                // SIGALRM시그널이면, 부모&자식프로세서를 종료시킨다.
                if (sigismember(&pend,SIGALRM))
                {
                    if (sigismember(&pend, SIGALRM))
                        printf("Get SIGALRM\n");
                    printf("Time Out\n");
                    sio_close(PRIVATE_PORT);
                    //프로시져의 시그널들을 oldset으로 변경한다.
                    sigprocmask(SIG_SETMASK,&oldset,NULL);
                    // set_timer을 풀어야 나중에 발생할 수도 있는
                    // SIGALRM시그널로 인한 종료를 막는다.
                    release_timer();
                    // 자식 프로세서에게 정상종료한다.
                    kill(pid,SIGTERM);
                    return 1;
                }
                printf("parent = %d\n",parent++);
            }
            else
            if (cnt)
            {
                RCH = com_getc();
                tempbuf[rlen++] = RCH;
                printf("tempbuf>>\n");
                printf("%s\n",tempbuf);
            }
        }
        printf("Get status : %d\n",status);
        sio_close(PRIVATE_PORT);
        return status;
    }
    else
    {
        if ((keyhandle = open("/dev/key",O_RDWR)) < 0)
        {
                perror("open key Fail");
                exit(3);
        }
        Event.fd = keyhandle;
        Event.events = POLLIN | POLLERR;
        child = 0;
        printf("parent PID : %u\n",getppid());
        printf("child  PID : %u\n",getpid());
        while(1)
        {
            cnt = poll((struct pollfd *)&Event, 1, 1000);
            if (cnt < 0)
            {
                perror("key poll() Error");
                exit(3);
            }
            else
            if (!cnt)
            {
                printf("child = %d\n",child++);
            }
            else
            if (cnt)
            {
                RCH = GetKey();
                if (RCH == CANCEL)
                {
                    close(keyhandle);
                    //부모프로세서에게 정상종료 시그널을 보낸다.
                    kill(getppid(), SIGTERM);
                    exit(3);
                }
                else printf("RCH = 0x%X\n",RCH);
            }
        }
    }
}



[리눅스] sleep &amp; usleep

sleep(int second)            : sleep(1)은 1초, sleep(10)은 10초를 나타낸다.
usleep(int micro_second) : usleep(1)은 1/1000000초, usleep(1000000)은 1초다.


[리눅스] 현재 시간을 자신이 원하는 포맷으로 출력하기

gmtime(3)

차례
1.1절. 사용법
1.2절. 설명
1.3절. 반환값
1.4절. 예제

1.1절. 사용법

#include 

struct tm *gmtime(const time_t *timep);


1.2절. 설명

timep 를 입력받아서 시간 값을 돌려준다.
시간 값은 tm 구조체에 들어간다.
tm 구조체는 다음과 같은 멤버 변수들을 포함한다.

struct tm
{
int tm_sec; /* 초 */
int tm_min; /* 분 */
int tm_hour; /* 시간 */
int tm_mday; /* 일/월 */
int tm_mon; /* 월 */
int tm_year; /* 년 */
int tm_wday; /* 일/주 */
int tm_yday; /* 일/년 */
int tm_isdst; /* 섬마타임 */
};

월은 0부터 시작한다. 그러므로 프로그램상에서 제대로 표현하려면 +1을
해주어야 한다. 또한 년의 경우에는 +1900 해주어야 한다.

아규먼트로 들어가는 timeptr 은 1970년 1월 1일 00:00:00 부터의
계산하고픈 때까지의 시간의 차이를 초로 환산한 값이다.

gmtime 은 UTC(Universal Time Coordinated) 협정 세계시를 되돌려준다.
각 지방시는 이것을 기준으로 결정이 된다. 이 세계시는
그리니치 평균시의 시간체계를 12시간 앞당겨 자정부터 시작하도록
조정되어 있다.


1.3절. 반환값

tm 구조체를 넘겨준다.


1.4절. 예제

#include 
#include
#include
#include

void swaptime(time_t, char *);
int main()
{
char buffer[255];
time_t the_time;

// time 함수를 이용해서 현재 시간을 얻어온다.
time(&the_time);

memset(buffer, 0x00, 255);
swaptime(the_time, buffer);
printf("%s
", buffer);
}

void swaptime(time_t org_time, char *time_str)
{
struct tm *tm_ptr;
tm_ptr = gmtime(&org_time);

sprintf(time_str, "%d-%d-%d %d:%d:%d", tm_ptr->tm_year+1900,
tm_ptr->tm_mon+1,
tm_ptr->tm_mday,
tm_ptr->tm_hour,
tm_ptr->tm_min,
tm_ptr->tm_sec);

}

위 프로그램을 컴파일한다음 실행시키면 다음과 같은 결과를 보여줄것이다.
[root@localhost test]# ./gmtime
2002-8-23 18:18:32


powered by performancing firefox




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

[Linux] key &amp; serial 멀티 프로세서로 처리하기  (0) 2006.12.09
[리눅스] sleep &amp; usleep  (0) 2006.11.29
프로세스 찾아서 지우고 실행하기  (0) 2006.08.21
데몬 프로그램 만들기  (0) 2006.08.21
Arm Assemble  (0) 2006.06.29
Posted by shellbt

프로세스 찾아서 지우고 실행하기




Damon(12)
프로그램을 만들다 보면, 이전에 동일한 프로세스가 떠있는지 확인을 해서, 떠있을 경우 바로 프로그램이 종료되도록 하는 코드를
넣어야할 필요가 있습니다. 이러한 경우 사용가능 한 간단한 함수 입니다. 다음과 같은 프로세스로 작동합니다.




이 코드는 리눅스(12) kernel(12) 2.6에서 테스트되었습니다. 아마도 2.2, 2.4에서도 잘돌아갈 것으로 생각됩니다.


   +------+
| 시작 |
+------+
|
+------------+
| Pid |
| 파일 체크 |
+------------+
|
+-----------------------+ Yes
| Pid 파일이 존재하는가 | ---------> 종료
+-----------------------+
| NO
|
+------------------------+ Yes
| 해당 PID의 /proc파일이 | --------> 종료
| 존재하는가 |
+------------------------+
| NO
|
+------------------------+
| 자신의 PID로 |
| Pid 파일을 덮어씀 |
+------------------------+
|
|
|





코드




#include 
#include
#include
#include

int CheckProcess(char *pfile)
{
FILE *fp;
char pid[16];
char process[256];
int rtv = 0;

fp = fopen(pfile, "r");
if (fp == NULL)
{
return 0;
}

if (fgets(pid, sizeof(pid) - 1, fp) == NULL)
{
fclose(fp);
return 0;
}
fclose(fp);


pid[strlen(pid)-1] = 0x00;
sprintf(process, "/proc/%s/exe", pid);
if (access(process, F_OK) == 0)
{
return atoi(pid);
}
return 0;
}

int WritePid(char *pfile)
{
FILE *fp;
char pid[16];
sprintf(pid, "%d
", getpid());
fp = fopen(pfile,"w");
fputs(pid, fp);
fclose(fp);
}





사용방법




int main(int argc, char **argv)
{
int pid;
if ((pid = CheckProcess("/tmp/test.pid")) == 0)
{
printf("Damon exe
");
WritePid("/tmp/test.pid");
while(1)
{
sleep(1);
}
}
else
{
printf("Damon is Exist %d
", pid);
}
}











아이디:
패스워드:
가입

  • 총 페이지 수 : 1563























  • Web


    joinc













    사이트 맵
    내용 출력 하기
    위키 도움말




     고치기 / 찾기 / 쪽 지우기 / 비슷한 쪽 Valid XHTML 1.0!

    Valid CSS!

    powered by performancing firefox




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

    [리눅스] sleep &amp; usleep  (0) 2006.11.29
    [리눅스] 현재 시간을 자신이 원하는 포맷으로 출력하기  (0) 2006.08.22
    데몬 프로그램 만들기  (0) 2006.08.21
    Arm Assemble  (0) 2006.06.29
    API &amp; SDK  (0) 2006.06.28
    Posted by shellbt

    데몬 프로그램 만들기

    데몬(daemon) 프로그램의 이해
    Posted on 2002/3/6

    Topic: 시스템 프로그램

    article/데몬(daemon) 프로그램에 대한 이해위키 홈으로
    article /데몬(daemon) 프로그램에 대한 이해



    Daemon 프로그램은 보통 telnet, httpd, mysql 과 같은 각종 서버를
    background 상태에서 돌아가는 프로그램을 말한다.
    그러나 background 프로그램과 Daemon 프로그램은 엄연한 차이가 있다.



    일반적인 background 프로그램은 터미널을 가지지만, Daemon 프로그램은
    터미널을 가지지 않는다.

    왜냐하면 보통 데몬프로그램은 특별한 일이 없는한 사용자와 상호대화할
    필요 없이 아무도 모르게 실행되어야 하기 때문이다.

    또한 모든 데몬 프로그램은 PPID 즉 부모 프로세스가 1번으로 세팅되며,
    이는 데몬 프로그램의 관리프로세스는 1번 pid 를 가지는 init 가 담당함을
    의미한다.






    [yundream@huhu loging_server]$ ./my_server
    [yundream@huhu loging_server]$ ps -efjc
    UID PID PPID PGID SID CLS PRI STIME TTY TIME CMD

    yundream 4314 4219 4314 4175 - 30 15:36 ttyp0 00:00:00 ./my_server
    [yundream@huhu loging_server]$ ./my_server -D
    [yundream@huhu loging_server]$ ps -efjc
    UID PID PPID PGID SID CLS PRI STIME TTY TIME CMD
    yundream 4319 1 4319 4319 - 30 15:37 ? 00:00:00 ./my_server


    위의 화면은 my_server 란 프로그램을 백그라운드 모드로 실행시켰을 경우와
    -D 옵션을 줘서 데몬모드로 실행시켰을때의 ps 정보를 보여준다.

    데몬 프로세스의 경우를 보면 알겠지만, PPID가 1로 세팅되어 있으며 TTY 즉
    터미널을 가지지 않음을 알수 있다. 그래고 SID 역시 자신의 PID와 같다는것을
    알수 있다.



    그럼 이제 실질적으로 데몬 프로그램을 만들도록 해보자, 데몬 프로그램을 만드는
    핵심은 바로위에서 설명한대로 터미널을 가지지 않으며 PPID가 1인 프로세스를
    만드는 것으로 아래와 같은 코딩 규칙을 이용해서 작성가능하다.

    1. 우선 fork 를 호출해서 자식프로세스를 생성시킨 다음 부모프로세스를
    종료시킨다.

    2. setsid 를 이용하여 새로운 세션을 만들고, 현재프로세스(자식)의 PID가
    세션의 제어권을 가지도록 한다.

    3. chdir 을 이용하여 프로세스가 루트디렉토리에서 작업을 수행하도록
    변경시켜준다.



    1번을 이해하려면 fork에 대한 이해가 필요한데, 기본적으로 부모프로세스가
    자식프로세스를 fork 했을경우 해당 자식프로세스의 PPID 는 부모프로세스의 ID
    가된다. 그런데 자식이 죽기전에 부모프로세스가 죽어버리면 자식프로세스의 PPID
    는 (다시말해서 자식프로세스의 소유 프로세스) 누가될까 ?

    부모 프로세스는 이미 죽었음으로 PPID가 될수 없을것이다.

    이럴 경우 자동적으로 자식프로세스의 관리 프로세스는 PID 1 번인 init 가
    담당하게 된다.


    2번의 setsid 는 새로운 새션을 생성하기 위해서 사용한다. 보통 세션은
    자신의 세션을 위한 tty 를 가져야 되는데, 새로운 세션을 생성하면 여기에
    tty 를 부여해 주어야 한다. 그렇지 않게 될경우 터미널을 가지지 않은 세션이
    생성되게 된다. 세션(Session)에 대한 논의는 다른 문서를 참고하기 바라고,
    간단히 생각해서 세션이란 프로그램 그룹의 모음이라고 일단은 생각해주길
    바란다.

    어쨋든 이렇게 해서 프로세스는 자신만의 독자적인 길을 걷게 된다.



    3번은 선택사항이다. 굳이 해주지 않아도 되지만, 데몬 프로그램에서 여러가지
    파일을 읽고 쓰는 작업을 할때 상대경로를 명시함으로써 일어나는 혼동을
    피하기 위해서 권장하는 방법이라고 생각하면 될것이다.



    데몬프로세스의 위의 3가지 조건만 만족시켜주면 된다.
    그럼 에제를 통해서 실제 데몬 프로그램을 만들어서 실행시키고, 그 결과를
    확인해 보도록 하자.


    예제 daemon.c



    #include  
    #include
    #include
    #include

    int main()
    {
    pid_t pid;

    if (( pid = fork()) < 0)
    exit(0);

    // 부모프로세스를 종료한다.
    else if(pid != 0)
    exit(0);

    //setsid();
    chdir("/");

    // 여기에 프로그램 본체를 넣는다.
    setsid();
    while(1)
    {
    sleep(1);
    }
    }


    아주아주 간단하게 데몬프로그램을 만들수 있음을 알수 있다.

    이제 결과를 한번 확인해 보도록 하자



    [yundream@localhost test]$ ./daemon
    [yundream@localhost test]$ ps -efjc | grep daemon
    UID PID PPID PGID SID CLS PRI STIME TTY TIME CMD
    yundream 18710 1 18710 18710 - 30 23:42 ? 00:00:00 ./daemon


    PPID가 1로 되어 있고 SID가 자신의 PID로 되어있으며 tty 를 가지지 않은
    프로세스가 만들어졌음을 알수 있을것이다.

    모든 프로그램에 위의 코드만 추가시켜주면 어렵지 않게 데몬프로그램을
    제작할수 있을것이다.





    powered by performancing firefox




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

    [리눅스] 현재 시간을 자신이 원하는 포맷으로 출력하기  (0) 2006.08.22
    프로세스 찾아서 지우고 실행하기  (0) 2006.08.21
    Arm Assemble  (0) 2006.06.29
    API &amp; SDK  (0) 2006.06.28
    u-boot 상에서 irq로 led테스트  (0) 2006.06.23
    Posted by shellbt

    Arm Assemble

    레지스터 r0~r15까지 16개 사용 가능

    Special Purpose General Register==========
        유저가 프로그램 할 때 레지스터 지정을 위해 사용할 수 있는 키워드

        r15 (Program Counter, PC)

        r13 (Stack Pointer, SP)
              : 스택을 위한 명령어가 따로 없다.
                 push, pop의 기능을 일반 데이터 전송 명령을 통해 해결

        r14 (Link Register, lr)
              : 링크 레지스터,
                 BL (Branch with Link)을 수행하면, pc(r15)값을 스택이 아니라, lr(r14)에 넣고 분기 번지를
                 pc(r15)에 넣어 분기, 스택 사용 않함
                 복귀할 때는 "mov pc, lr"이라는 데이터 전송명령으로 복귀
                 * 한번의 call만 하는 경우라면, 스택을 사용하지 않기 때문에 속도가 빠르다.


    Status Register ==========
        PSR이라고 부른다. 일반적으로는 CPSR(Ccurrent Processor Status Register)이라고 한다.
        32비트의 레지스터가 6개 있다.한번에 모두 사용할 수는 없다.
        PSR은 flag bits, control bits로 나뉜다.
       
        Flag Bits :
              어떤 인스트럭션의 결과을 나타내는 부분 (4비트)
                    1) N (Negative/Less than flag)
                             : 연산의 결과가 마이너스 일 때 세트
                    2) Z (Zero flag)
                             : 연산의 결과가 0이 일 때 세트
                    3) C (Carry/Borrow/Extend flag)
                             : 자리올림이나, 내림이 발생, 그리고 shift연산등에서 세트
                    4) V (Overflow flag)
                             : 연산의 결과가 오버플로우인 경우에 세트
        Control Bits :
              인터럽트을 제어하거나, CPU 동작모드를 설정하거나 확인 할 수 있는 bit들
                    1) IRQ / FIQ
                             : IRQ, FIQ를 금지 시킬 수 있는 플래그
                    2) Mode Bits
                             : M0 ~ M4 의 비트들은 CPU의 6개의 동작 상태를 나타낸다.




    powered by performancing firefox




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

    프로세스 찾아서 지우고 실행하기  (0) 2006.08.21
    데몬 프로그램 만들기  (0) 2006.08.21
    API &amp; SDK  (0) 2006.06.28
    u-boot 상에서 irq로 led테스트  (0) 2006.06.23
    에라이 씨발...  (0) 2006.06.23
    Posted by shellbt

    API &amp; SDK

    API (Application Programming Interface)
        OS에서 제공하는 프로그래밍을 위한 함수들...
        보통 C의 함수 형태로 구성
        ==> 운영체제가 응용 프로그램을 위해 제공하는 함수의 집합

    SDK(Software Development Kit)
        API와 비슷한 말...
        원래는 API를 사용하여 프로그램을 개발하는 개발 툴 킷이었으나, 지금은 의미가 전용
        되어 API와 거의 같은 뜻으로 쓰인다.

    DLL(Dynamic Link Library)
        작은 프로그램들의 집합.
        주프로그램과 함께 램에 적재되지 않기 때문에 램 공간을 절약한다.
        (필요한 경우에만 적재되어 실행된다.)



    powered by performancing firefox




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

    프로세스 찾아서 지우고 실행하기  (0) 2006.08.21
    데몬 프로그램 만들기  (0) 2006.08.21
    Arm Assemble  (0) 2006.06.29
    u-boot 상에서 irq로 led테스트  (0) 2006.06.23
    에라이 씨발...  (0) 2006.06.23
    Posted by shellbt

    u-boot 상에서 irq로 led테스트

    Xscale PXA255로 공부하고 있는 학생입니다.

    유영창님의 보드를 살려보자라는 글을 보고 어셈으로 start.S와 링커파일과 Makefile을
    만들어서 이미지 생성 후 포팅했는데 전혀 GPIO 17번 핀에 연결 된 LED가 작동을 하지 않습니다.

    자세히 보니깐 칩 LED인데 아주 미세하게 켜지는건 같은데 제대로 된 동작같지는 않아여

    혹시 부트 로더로 LED on/off 해보신분 답변좀 해주세여...

    start.S 어셈파일입니다.



    #define PXA_REG_GP_BASE 0x40E0000
    #define PXA_REG_OFFSET_GPDR0 0x0C
    #define PXA_REG_OFFSET_GPSR0 0x18
    #define PXA_REG_OFFSET_GPCR0 0x24
    #define WAIT_TIME_LOOP 0xa0000
    #define DEBUG_GPIO_LED1 (1<<17)


    .text
    .globl _start
    _start:
    b reset
    b Undefined_Instruction
    b Software_Interrupt
    b Prefetch_Abort
    b Data_Abort
    b Not_Used
    b IRQ

    b FIQ


    reset:
    ledtest:

    ldr r0, =PXA_REG_GP_BASE
    mov r1, #DEBUG_GPIO_LED1

    str r1, [r0, #PXA_REG_OFFSET_GPDR0]
    str r1, [r0, #PXA_REG_OFFSET_GPCR0]

    ledon: mov r4, #WAIT_TIME_LOOP

    delay: nop
    nop
    subs r4, r4, #1
    bne delay

    str r1, [r0, #PXA_REG_OFFSET_GPSR0]

    mov r4, #WAIT_TIME_LOOP

    ledoff: nop
    nop
    subs r4, r4, #1
    bne ledoff
    str r1, [r0, #PXA_REG_OFFSET_GPSR0]
    b ledon


    boot_falut:
    b reset


    led_error_loop:

    Undefined_Instruction:
    Software_Interrupt:
    Prefetch_Abort:
    Data_Abort:
    Not_Used:
    IRQ:
    FIQ:
    b led_error_loop


    powered by performancing firefox




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

    프로세스 찾아서 지우고 실행하기  (0) 2006.08.21
    데몬 프로그램 만들기  (0) 2006.08.21
    Arm Assemble  (0) 2006.06.29
    API &amp; SDK  (0) 2006.06.28
    에라이 씨발...  (0) 2006.06.23
    Posted by shellbt
    prev 1 2 next

    openclose