- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是相关代码,我尽可能缩短了它,希望不排除错误源。
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);
不会像它应该的那样阻止每个第二个调用。 (至少我希望这个函数应该是阻塞的)
一旦网络服务器发送请求,函数就会释放,运行循环而不记录任何错误,调用 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///////
//////////////////////////////
(请有人编辑日志文本,使其不格式化为代码,我不知道该怎么做)
由于请求未提供信息并被关闭,因此发生 fatal error 。重点是,为什么iRet = FCGX_Accept_r (&requestFcgx);
返回 0
当它明显失败时?如果预期会这样做,我必须在多大程度上考虑这种行为。
最佳答案
有两个问题 -
while(1)
循环之前需要调用FCGX_InitRequest(&requestFcgx, 0, 0)
。SIGPIPE 信号也可能导致此行为。尝试忽略它。将此 block 添加到 main()
函数的开头 -
struct sigaction sa_ign;
sa_ign.sa_handler = SIG_IGN;
sa_ign.sa_flags = 0;
sigemptyset(&sa_ign.sa_mask);
sigaction(SIGPIPE, &sa_ign, NULL);
您提到该应用程序是多线程的。如果是这样,您还必须调用FCGX_Init()
。以下是来自 fcgiapp.h
头文件的信息 -
/*
*----------------------------------------------------------------------
*
* FCGX_Init --
*
* Initialize the FCGX library. Call in multi-threaded apps
* before calling FCGX_Accept_r().
*
* Returns 0 upon success.
*
*----------------------------------------------------------------------
*/
DLLAPI int FCGX_Init(void);
检查这个简单的多线程 FastCGI 应用程序 -
关于c - FCGX_Accept_r 在没有有效请求的情况下返回成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29652981/
这是相关代码,我尽可能缩短了它,希望不排除错误源。 DebugLogMsg是一个类似printf的日志文件写入工具,可以认为不会导致错误。 //Some init stuff and smthng
我正在用 C++ 编写一个 fastcgi 应用程序,并且正在努力解决 FCGX_Accept_r() 退出而不阻塞且返回值为“-88”的问题。经过大量谷歌搜索后,我发现您必须正确初始化 FCGX 结
我正在尝试创建用 C 编写的简单 FastCGI 应用程序: #include #include int main() { int sockfd = FCGX_OpenSocket("12
我有一个单线程 FastCGI“Hello, World!”应用程序,有一些代码: error = FCGX_Init(); // error handling socket_descriptor =
我是一名优秀的程序员,十分优秀!