- 论坛徽章:
- 0
|
接上面......
int mainp()
{
EXEC SQL BEGIN DECLARE SECTION;
Stru_StepDef str_step;
EXEC SQL END DECLARE SECTION;
pid_t pid,ipid1;
int i=5,iforkerrs=0;
int n;
long j = 0;
/*启动守护进程*/
n = daemon_init();
elog(6,"daemon_init[%d]!!",n); ---这个有返回!!!!
if (n != 0)
{
elog(6,"[NB03]后台服务守护进程启动..失败!!rtn=%d",n);
exit(1);
}
/*取得父进程的pid号*/
ipid1=getpid(); ----取不出来!!!!
mpid=ipid1;
elog(6,"mpid=[%s]!!",mpid);
elog(6,"[NB03]mpid=[%s]后台服务守护进程启动...成功!!",mpid);
//imaxp=5;
i=imaxp;
while (i--)
{
iforkerrs=0;
if ((pid = fork()) < 0)
{
iforkerrs++;
elog(6,"[NB04]mpid=[%s]子进程产生失败,进行第[%d]次尝试!!",mpid,iforkerrs);
exit(1);
}
if (pid == 0)
{
vfun(imaxp-i-1); /*虚拟子进程,初始化为5个*/
exit(0);
}
}
elog(6,"%s!!", "初始化5个成功!!");
if (0!=dbconnect())
{
elog(6,"[NB01]连接数据库...失败!!sqlcode=%d",SQLCODE);
exit(EXIT_FAIL);
}
elog(6,"[NB01]连接数据库...成功!!");
EXEC SQL DECLARE cur_step CURSOR FOR
SELECT jyr, stepid, srvid
FROM nsi_srv_parall
WHERE isdone='0' AND isvalid='0' ORDER BY jyr,stepid;
EXEC SQL OPEN cur_step;
if( SQLCODE !=0 )
{
elog(6,"[NB02]服务类型作业配置表游标打开...失败!!sqlcode=%d",SQLCODE);
//Batch_Err(sprocname, scurjyr, s_errtxt);
EXEC SQL CLOSE cur_step;
dbdisconnect();
exit(EXIT_FAIL);
}
elog(6,"[NB02]服务类型作业配置表游标打开...成功!!");
j = 0;
while (wait(NULL) > 0)
{
/*从作业表中取作业,如果没有作业则等待*/
while (1)
{
memset((Stru_StepDef *)&str_step, 0x00, sizeof(Stru_StepDef));
EXEC SQL FETCH cur_step into :str_step;
if (NODATA) /*没有数据则循环等待10分钟*/
{
elog(6,"[NB05]mpid=[%s]没有作业需要运行,等待[%d]秒!!",mpid,iwaitfechs);
sleep(600);
continue;
}
if(SQLCODE!=0 && SQLCODE!=1405 && SQLCODE!=1403)
{
elog(6,"[NP05]mpid=[%s]从服务类型作业表中取数据...失败,退出!!sqlcode=%d",mpid,SQLCODE);
//Batch_Err(sprocname, scurjyr, s_errtxt);
sleep(600);
continue;
//errexit(s_errtxt);
}
break;
}
elog(6,"[NB05]mpid=[%s]从服务作业表中取数据...成功!!jry=[%s],stepid=[%s],srvid=[%s]", \
mpid,str_step.jyr,str_step.stepid,str_step.srvid);
/*产生子进程*/
iforkerrs=0;
//while(1)
//{
if ((pid = fork()) < 0)
{
iforkerrs++;
elog(6,"[NB06]mpid=[%s]子进程产生失败,进行第[%d]次尝试!!",mpid,iforkerrs);
//if (iforkerrs>imaxforkerrs);
//{
// sprintf(s_errtxt,"[NB06]mpid=[%s]产生子进程失败,尝试超过[%s]次...退出!!",mpid,imaxforkerrs);
//Batch_Err(sprocname, scurjyr, s_errtxt);
EXEC SQL CLOSE cur_step;
dbdisconnect();
exit(1);
// }
/*等待再尝试*/
//sleep(iwaitforks);
//continue;
}
//break;
// }
if (pid == 0) /*子进程*/
{
j++;
elog(6,"[NB06]mpid=[%s]产生总第[%ld]个子进程进行作业处理!!",mpid,j);
subp((char *)str_step.jyr,(char *)str_step.stepid);
exit(0);
}
}
EXEC SQL CLOSE cur_step;
dbdisconnect();
return 0;
}
程序运行产生的log如下:
16:30:56->sigaction begin!!
16:30:56->sigaction 1!!
16:30:56->sigaction 2!!
16:30:56->sigaction 3!!
16:30:56->sigaction 4!!
16:30:56->sigaction 5!!
16:30:56->pid=[5906]!!
16:30:56->daemon_init[0]!!
目前程序执行到daemon_init();
处并没有产生后台进程,随后的getpid()无法取得父进程号,后面的子进程也都没产生。
我加pro*c部分前是可以的,请各位大侠帮助看看,顺便帮我看看我的代码,还有那些问题。。 |
|