C프로그램 안에서 OS명령을 수행하는 방법은 여러가지가 있는데 그 중 system이란 함수가 있다.

난 보통 이 함수를 이용해서 OS명령을 수행하는데 system 함수를 통해 수행한 명령의 리턴값이 필요할 때가 있다.

이전에는 몰랐지만 그냥 system 함수의 리턴값을 사용하면 된다.

int          sRet = 0;
sRet = system( "diff a b" );
이런 식으로 리턴값을 받아와서 결과에 따른 핸들링이 가능하다. 특이 점으로는 위에서 예를 들은 diff 명령의 리턴값은 0,1,2인데 변수에 담아서 확인 해보면 0, 256, 512로 나온다.

데이터베이스를 구축하는데 있어 자료구조는 공간관리 파트에서만 하면 될 줄 알았는데..
내 작업 범위에 자료구조의 이해가 필요한 부분이 있었다.
lr parser가 아직 미구현되어 있어 대충 if ~ then ~으로 비슷하게 동작하는 parser를 구현해두었는데 여기서 offset을 입력해야 한다.
이에 대해 정확하게 하기 위해 조금 알아보니 시스템 별로 다르기도 하단다;;;;;
여튼 일단은 linux에서 구현하는 중이라 linux에 국한된 offset 계산법을 알아야 한다.
이를 공부하기 위해서 문헌을 찾아보는게 가장 좋지만 몸으로 계산해서 규칙을 찾아내 보려고 한다.
물론 대강의 규칙은 수석연구원분이 이미 알려주셨기에 가능했다.
offset을 알아내는데 쓰인 offsetof 매크로이다. 간단한 예제를 아래와 같이 작성했다.

#include <stddef.h>
#include <stdio.h>

struct foo 
{
    short       s;
    int         i;
    double      d;
    float       f;
    long        l;
    char        c[10];
};


int main()
{
    printf("short  size:%lu offset:%lu\n", (unsigned long)sizeof(short), (unsigned long)offsetof(struct foo, s));
    printf("int    size:%lu offset:%lu\n", (unsigned long)sizeof(int), (unsigned long)offsetof(struct foo, i));
    printf("double size:%lu offset:%lu\n", (unsigned long)sizeof(double), (unsigned long)offsetof(struct foo, d));
    printf("float  size:%lu offset:%lu\n", (unsigned long)sizeof(float), (unsigned long)offsetof(struct foo, f));
    printf("long   size:%lu offset:%lu\n", (unsigned long)sizeof(long), (unsigned long)offsetof(struct foo, l));
    printf("char   size:%lu offset:%lu\n", (unsigned long)sizeof(char[10]), (unsigned long)offsetof(struct foo, c));
    return 0;
}

문자열에서 특정 문자의 위치를 찾는 함수로 strchr이 있다. 단점이라 하면 한글자의 문자만 찾을 수 있는 것 같다.
원형이 아래와 같다.

char* strchr(const* s, int c);

대충 간단하게 아래 예제와 같이 쓰면 된다. 문자열에서 검색할 문자가 검색되지 않는다면 NULL을 리턴한다. strrchr은 뒤부터 검색하여 위치를 알려준다. 또, memchr이란 함수도 있는데 비슷할거라 생각한다.

#include <string.h>
void main()
{
    char string[] = "abcdcfg";
    char* i;

    i=strchr( string, 'c' );
    printf("##%d, %s\n", i-string, i);
    i=strrchr( string, 'c' );
    printf("##%d, %s\n", i-string, i);

}