2010-04-19 4 views
2

나는 실행 시간이 스크립트 파일에서 구성 매개 변수를 취해야한다. 이 방법은 모든 구성 변경에 대한 코드를 다시 컴파일 할 필요가 없습니다. 지금은 .h 파일에 모든 구성 값이 있습니다. 때마다 그것을 다시 컴파일해야합니다.리눅스에서 C를위한 설정 파일

플랫폼은 Linux의 경우 C, gcc입니다.

이 문제를 해결하는 가장 좋은 해결책은 무엇입니까? 나는 Google에서 XML, phthon 및 Lua 바인딩을 찾았습니다. 별도의 스크립팅 언어를 사용하는 것이 가장 좋습니다. 그렇다면 내 필요에 대해 어느 것이 좋습니다?

추가 정보 : 스크립트 파일에서 데이터 구조를 미러링하려면 어떻게해야합니까? 예를 들어 구조 배열을 가지고 있다면 쉽게 저장하고로드 할 수 있습니까? 같은 SIGUSR1 같은 신호가 수신 될 때

감사

+3

왜 파일을 읽으려면 별도의 언어가 필요합니까? 구성을 텍스트 파일에 저장하고 C 프로그램에서 읽습니다. –

+0

스크립트 파일에서 데이터 구조를 미러링하려면 어떻게해야합니까? 예를 들어 구조 배열을 가지고 있다면 쉽게 저장하고로드 할 수 있습니까? – James

+1

@James : 데이터 구조를 저장하려면 XML 또는 YAML이 일반 텍스트보다 낫습니다. – FrustratedWithFormsDesigner

답변

0

당신은 설정 파일을 다시 읽어 수 있습니다.

+0

왜 SIG_HUP가 아니겠습니까? –

+1

SIGHUP은 서버용입니다. –

1

일반 텍스트 파일에 어떤 문제가 있습니까? 앱이 시작될 때 또는 앱의 수명이 끝날 때까지 이러한 구성 설정을 한 번 읽으십니까? 그들은 언제 쓰여 집니까? 변경 될 때마다 다시 컴파일해야하기 때문에 앱 시작시 한 번만 읽는 것 같습니다.

Config1 = 1 
ConfigValue2 = 33.4 
ConfigValue3 = ABC 

더 복잡한 설정이있는 경우, 어쩌면 일부 계층 :

값의 소수가 있다면, 그때 간단하게 키/값 쌍으로 포맷 된 텍스트 파일을 고수라고 말하고 싶지만 값의 경우 XML이 더 적합 할 수 있습니다.

1

"스크립트 파일"이 필요한 구성이 어느 정도 필요합니까?

코드의 일부만 남겨두면 편리합니다. ini 형식 파서입니다.

2

가장 간단한 방법은 같은 것을 포함하는 텍스트 파일이하는 것입니다 :

key = value 
key2 = anothervalue 
.... 
keyn = etc 

을 그리고 당신은 단순히 해시 맵/사전처럼 뭔가에 최선을 다하는,이 파일을 열고 구문 분석.

google에서 빠른 검색을 할 수있는 라이브러리 (libConfuse)가 제공됩니다.

+3

좋은 이전 구성 파일! –

0

당신은 외부에서 모든 설정 값을 저장하고 이전 일반 C로 읽어

당신과 같이 할 수 있습니다 :

PARAM을 = 값은 PARAM2 =이

을 값 2와 함께 일반적으로 읽기 fgets를 찾고 strtok을 찾고 '='다음 params와 value를 모두 가지고 있습니다. 당신이 XML을 사용하려는 경우

난 당신이 libxml2.

+1

피하기 strtok() :) –

2

체크 아웃 CCANciniparser을 추천합니다. 이것의 포크는 the original iniparser (더 이상 유지 관리되지 않음)이며 INI 스타일 구성 파일을 쉽게 구문 분석합니다.예 (거의 단위 테스트에 의해 미러링)에서

코드 :

#include <stdio.h> 
#include <stdbool.h> 
#include <ccan/ciniparser/ciniparser.h> 

#define CONFIG_FILE "/etc/config.ini" 

int main(int argc, char *argv[]) 
{ 
     dictionary *d; 
     char *val1; 
     bool val2; 
     double val3; 
     int val4; 

     d = ciniparser_load(CONFIG_FILE); 
     if (d == NULL) 
      return 1; 

     val1 = ciniparser_getstring(d, "daemon:pidfile", NULL); 
     val2 = ciniparser_getboolean(d, "daemon:debug", false); 
     val3 = ciniparser_getdouble(d, "daemon:maxload", 3.5); 
     val4 = ciniparser_getint(d, "daemon:maxchild", 5); 

     ciniparser_freedict(d); 

     return 0; 
} 

물론, 당신은 당신의 나무와 #include "iniparser.h"에 필요한 몇 개의 파일을 삭제할 수 있습니다, 다른 CCAN 모듈에 대한 종속성이없는하지 않는 한 당신은 단위 테스트를하고 싶습니다.

샘플 구성은 다음과 같습니다

[stooges] 
larry=larry_stooge 
curly=curly_stooge 
moe=moe_stooge 
shemp=questionable 

[cartoons] 
tom_hates=jerry 

A는 정적으로 당신이 (즉 strdup()) (수정하지 않고) 그대로 사용하거나 할당하고 중복 것이라고 questionable를 할당 얻을 것 stooges:shemp의 값을 얻기. 그것보다 훨씬 쉽지는 않습니다. 간단한 뮤텍스와 스레드 안전성을 사용하여 사전에 대한 액세스를 줄이십시오.

CCAN은 포괄적 인 C 아카이브 네트워크입니다. CPAN, 그냥 C라고 생각하십시오. 그것의 프로젝트 Rusty Russell은 마침내 약간의 견인력을 얻고있다.

면책 조항 : 모듈을 유지 관리합니다.

5

나는 Lua을 권장합니다. 구성을 위해 설계되었습니다.

관련 문제