【发布时间】:2015-06-21 13:50:11
【问题描述】:
这是相关代码,我尽量短了希望不排除错误源。
DebugLogMsg是一个类似printf的日志文件写入工具,可以认为没有报错。
//Some init stuff and smthng
while (1)
{
memset (&requestFcgx, 0, sizeof (requestFcgx));
iRet = FCGX_InitRequest (&requestFcgx, 0, 0);
DebugLogMsg ("FCGX_InitRequest() called!!\r\n");
if (iRet != 0)
{
DebugLogMsg ("FCGX_InitRequest failed, return val:%d!\r\n", iRet);
return NULL;
}
iRet = FCGX_Accept_r (&requestFcgx);
if (iRet != 0)
{
DebugLogMsg1 ("FCGX_Accept_r failed!\r\n");
continue;
}
char *foo = FCGX_GetParam("SOME_CUSTOM_VAL", requestFcgx.envp);
DebugLogMsg ("CustomParam:%s\r\n", foo);
do
{
//processing the request...
if (ERROR == TRUE)
{
DebugLogMsg ("FatalError!\r\n");
return NULL;
}
DebugLogMsg ("no errors occured!");
}
while (0);
FCGX_Finish_r (&requestFcgx);
DebugLogMsg ("Cleanup.... DONE!\r\n");
}
我的问题是 iRet = FCGX_Accept_r (&requestFcgx); 不会阻止每个第二次呼叫,因为它应该。 (至少我希望这个函数应该是阻塞的)
一旦网络服务器发送请求,Function 就会释放,在没有记录任何错误的情况下运行循环,调用 Finish,循环到循环体的开头,当再次调用 iRet = FCGX_Accept_r (&requestFcgx); 时,它会立即返回iRet == 0 但 requestFcgx 结构似乎无效(这是可以预料的,因为甚至没有发起附加请求)。此进程对应的日志文件包含:
[Wed Apr 15 15:41:26 2015][Thread:0;0x802420040] FCGX_InitRequest() called!
----------------------------------------
[Wed Apr 15 15:41:26 2015][Thread:0;0x802420040] CustomParam:ExpectedStuff
[Wed Apr 15 15:41:26 2015][Thread:0;0x802420040] no errors occured!
[Wed Apr 15 15:41:26 2015][Thread:0;0x802420040] Cleanup.... DONE!
[Wed Apr 15 15:41:26 2015][Thread:0;0x802420040] FCGX_InitRequest() called!
----------------------------------------
[Wed Apr 15 15:41:26 2015][Thread:0;0x802420040] CustomParam:(null)
[Wed Apr 15 15:41:26 2015][Thread:0;0x802420040] FatalError!
//////////////////////////////
////////Protocol closed///////
//////////////////////////////
(请有人将 Logtext 编辑为不格式化为代码,我不知道该怎么做)
由于请求未提供信息并被关闭,因此发生致命错误。关键是,为什么iRet = FCGX_Accept_r (&requestFcgx); 在明显失败时返回0?以及我必须在多大程度上考虑这种行为,如果预期这样做的话。
【问题讨论】: