함수 이름을 포인터에 할당하여 사용하기

//      funcPtr.c
//     
//      Copyright 2009 Kim Sung-tae <pchero@MyNote>
//     
//      This program is free software; you can redistribute it and/or modify
//      it under the terms of the GNU General Public License as published by
//      the Free Software Foundation; either version 2 of the License, or
//      (at your option) any later version.
//     
//      This program is distributed in the hope that it will be useful,
//      but WITHOUT ANY WARRANTY; without even the implied warranty of
//      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//      GNU General Public License for more details.
//     
//      You should have received a copy of the GNU General Public License
//      along with this program; if not, write to the Free Software
//      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
//      MA 02110-1301, USA.

#include <stdio.h>

#define FUNC1 func1
#define FUNC2 func2

int func1(int intVal1) { return –intVal1; }
int func2(int intVal2) { return –intVal2; }

int runFunc(char* string, int inVal)
{
    int retVal;
    int (*funcPtr)(int retVal);
    funcPtr = string;
    return (*funcPtr)(inVal);
}

int main(int argc, char** argv)
{
    int intVal = 3;
    intVal = runFunc(FUNC2, intVal);
    printf(“After running func2 intVal : %dn”, intVal);
    intVal = runFunc(FUNC1, intVal);
    printf(“After running func1 intVal : %dn”, intVal);
   
    return 0;
}

 함수 이름을 포인터에 할당하여 사용하는 재미있는 프로그램.
 함수들을 필요한 순서대로 만들어 둔 뒤, 포인터를 이용하여 상황에 따라 적절한 함수가 호출되도록 만든다면 상태머신(State machine)프로그램 등 유용하게 사용할 수 있을 것이다.

Kill() 을 이용한 프로세스 모니터링

 PID를 디스크에 기록하는 전략은 시스템 데몬들이 주로 사용하는 표준으로 syslog에서 OpenSSH까지의 모든 데몬이 이를 사용한다.

 일단 파일시스템에서 PID 파일을 이용할 수 있게 되면 프로세스는 ps 출력을 구문 분석하거나 유사 파일시스템(pseudo-filesystem) /proc 를 검색하지 않고도 자신의 다른 인스턴스가 이미 실행 중인지 확인할 수 있다. 이 해결책은 kill() 시스템 호출의 반환 값을 이용하는데, 확인하고자 하는 프로세스에게 SIGTERM, SIGHUP 또는 기타 표준 신호를 전송하는 대신 SIG_0 을 전송한다.

 이는 프로세스가 현재 실행 중이면(즉, 프로세스 테이블에 해당 프로세스 항목이 존재한다면) kill() 이 ‘0’을 반환하고 프로세스가 실행 중이지 않거나 오류 조건이 발생하면 ‘0이 아닌 값’을 반환하게 한다. psad 데몬이 실행 중인지 여부를 확인하는 데 이 방법을 어떻게 사용하는지 보이기 위해 다음과 같은 명령어를 사용할 수 있다.

User image
 0 이 반환됐으므로 psad 가 현재 시스템에서 실행 중임을 알 수 있다.

 kill() 시스템 호출이 실제로 어떻게 사용되며 무엇을 반환하는지 알아보기 위해 strace 유틸리티를 사용해보자. 마지막 행의 = 0 이 kill() 의 반환 값이다.

User image
 끝으로 충분히 발달한 모든 프로그래밍 언어가 kill() 시스템 호출에 대한 인터페이스를 제공하며 여기서는 psad 가 현재 실행 중인지 아니지를 탐지하기 위해 어떻게 펄을 사용하는지 알아본다.(kill() 시스템 호출은 굵게 나타낸 행에서 호출한다.)

User image

윈도우에서 QDevlop 사용하기…

 리눅스와 윈도우에서 모두 사용할 수 있는 Qt 프로그램..

 하지만 윈도우에서 Qt 프로그램을 컴파일하기 위해서는 별도의 조치가 필요하다.(리눅스도 마찬가지..)

 대표적으로 사용하는 것은 QDevelop…

 QDevelop의 설치를 위해서는 다음의 과정을 따른다.

 먼저 MinGW와 Qt를 설치한다.

 다음의 사이트에서 qt와  mingw 가 같이 있는 파일을 다운받아 설치한다.

 
 여러가지 항목 중, Automated MinGW Installer 를 다운받아서 설치하는 것이 간편하다.

 그리고
 

 다음의 사이트에서 QDevelop를 다운받고 설치한다.
 http://qdevelop.org/

man 페이지만 따로 설치하기..

 노트북에 깔려있던 리눅스에 이상하게 man 3번 섹션, 즉 라이브러리 콜에 대한 man 페이지가 설치되어 있지 않았다.

 평소에는 불편하긴했지만 인터넷의 도움으로 그럭저럭 쓸 수 있었다.

 하지만 매번 맨페이지를 보기 위해 웹 브라우저를 띄우고 검색을 하는 과정이 계속되자 짜증이났다.

 KLDP에서 잠시 검색을 해보니 이내 답을 찾을 수 있었다.

 sudo apt-get install manpages-dev

 명령어 한줄로 간단히 해결되었다.

 이제 귀찮음이여 안녕이다. : )

 원본 : http://kldp.org/node/91231