Cモジュールが落ちる現象について
お世話になっております。
現在、C言語でモジュールを作成しているのですが、
下記の関数の箇所でたまにこけるということがわかりました。
この関数のどこでこけているかまでは、判断できていないのですが、
皆様のお力をお貸しいただけないでしょうか。
【ソース概要】
本モジュールはオブジェクトの監視に使用するものなのですが、
設定ファイルより、そのオブジェクトの監視時間帯を確認する関数です。
関数の引数として監視対象オブジェクト名を渡します。
また、本関数を実行するCモジュールは、異なる引数で同時に複数回実行されます。
【設定ファイル内容】
確認日付(曜日) オブジェクト名 監視開始時間1 監視終了時間1 監視開始時間2 監視終了時間2
0415 オブジェクト名 000000 040000 051500 240000
⇒4月15日はオブジェクトを0時0分0秒から4時0分0秒までと、5時15分00秒から24時00分00秒まで監視する
0 オブジェクト名 000000 040000 051500 240000
⇒0(日曜日)はオブジェクトを0時0分0秒から4時0分0秒までと、5時15分00秒から24時00分00秒まで監視する
【ソース】
int kansiqmcheck(char Object[256]){
FILE *fp ;
time_t t;
struct tm *ck_time ;
char cktm[5],ckwk[4],line[256],ln[256],mes[512],obj[256] ;
int rc=0 , nowtime=0, RC=0 , i ;
char *ckdt[6] ;
/* 変数初期化など */
memcpy(obj,0,sizeof(obj));
strcpy(obj,Object);
memcpy(line,0,sizeof(line));
t=time(NULL);
ck_time = localtime(&t);
sprintf(cktm,"%02d%02d",ck_time->tm_mon + 1,ck_time->tm_mday);
sprintf(ckwk,"%d ",ck_time->tm_wday);
strcat(obj," ");
for(i=0 ; i < 6 ; i++){
ckdt[i] = NULL;
}
/* 監視設定ファイルオープン */
if((fp = fopen(CHECKTIMEFILE,"r")) == NULL ){
memcpy(mes,0,sizeof(mes));
sprintf(mes,"%s: CheckTimeFileOpenError:%s" , Targ , CHECKTIMEFILE) ;
log_out(mes);
exit(1) ;
}
/* 監視設定ファイルより監視対象オブジェクトの当日の監視に関する情報を取得 */
while(fgets(line,256,fp)!=NULL) {
if(strncmp(line,cktm,strlen(cktm)) == 0 && strstr(line,obj) != NULL){
rc=1;
break ;
}else if(strncmp(line,ckwk,strlen(ckwk)) == 0 && strstr(line,obj) != NULL){
rc=1;
break ;
}
memcpy(line,0,sizeof(line));
}
fclose(fp) ;
fp = NULL ;
/* 監視オブジェクトより、現時刻が監視時間帯に該当するか確認 */
if(strlen(line) > 2 ){
memcpy(ln,0,sizeof(ln));
strncpy(ln,line,strlen(line) - 1 );
i=0;
ckdt[i] = strtok(ln," \n\0");
while(ckdt[i] != NULL || i < 6){
i++ ;
ckdt[i] = strtok(NULL," \n\0");
}
if( i < 2 ){
memcpy(mes,0,sizeof(mes));
sprintf(mes,"%s: CheckTimeInfoError(obj):%s %s %d" , Targ , CHECKTIMEFILE , line , i) ;
log_out(mes) ;
return;
}
while(1){
t=time(NULL);
ck_time = localtime(&t);
nowtime = ck_time->tm_hour * 10000 + ck_time->tm_min * 100 + ck_time->tm_sec ;
for( i = 2 ; ckdt[i] != NULL ; i=i+2 ){
if( nowtime > atoi(ckdt[i]) && nowtime < atoi(ckdt[i+1]) ){
rc=0;
break ;
}
}
if( nowtime >= atoi(ckdt[i]) && nowtime < atoi(ckdt[i+1]) ){
rc=0;
break ;
}
/* エラーログ確認用 */
if( strcmp(Targ,"ELG") == 0 ){
RC=1;
}
memcpy(mes,0,sizeof(mes));
sprintf(mes,"%s: 監視スキップ:%s" , Targ , obj ) ;
log_out(mes);
sleep(10);
if(checkstat() != 0 ){
break ;
}
}
}
return(RC);
}
お礼
ご自身の作業時間を削ってまでお付き合い頂き、大変ありがとうございました。 改めて基本的な部分から見直すきっかけとなり、大変有意義なQ&Aとなりました。 ベストアンサーは決めにくいので、とりあえず本回答をベストアンサーとして、質問を締め切らせて頂きます。 ご回答頂いた全ての皆様、ありがとうございました。