FCGX_Accept_r 失败并显示 -88 return 代码
FCGX_Accept_r fails with -88 return code
我正在用 C++ 编写一个 fastcgi 应用程序,并且正在努力解决 FCGX_Accept_r() 退出而不阻塞 return 值为“-88”的问题。经过大量谷歌搜索后,我发现您必须正确初始化 FCGX 结构,更正 uds 套接字上的 umask,不要忘记 FCGX_Init() 并检查 FCGX_Init 的 return 代码() 和 FCGX_InitRequest().
我已经为我的程序完成了以上所有工作,但结果还是一样。
所以我尝试从这里的 fcgi 站点构建示例 C 应用程序:http://www.fastcgi.com/devkit/examples/threaded.c
它立即退出。
奇怪的是他们那里没有任何插座。所以我添加了几行 - 打印出 FCGX_Accept_() return 值并打开一个 uds 套接字。
这是结果代码:
/*
* threaded.c -- A simple multi-threaded FastCGI application.
*/
#ifndef lint
static const char rcsid[] = "$Id: threaded.c,v 1.9 2001/11/20 03:23:21 robs Exp $";
#endif /* not lint */
#include "fcgi_config.h"
#include <pthread.h>
#include <sys/types.h>
#include <sys/stat.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <stdio.h>
#include "fcgiapp.h"
#define THREAD_COUNT 20
static int counts[THREAD_COUNT];
static void *doit(void *a)
{
int rc, i, thread_id = (int)a;
pid_t pid = getpid();
FCGX_Request request;
char *server_name;
FCGX_InitRequest(&request, 0, 0);
for (;;)
{
static pthread_mutex_t accept_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t counts_mutex = PTHREAD_MUTEX_INITIALIZER;
/* Some platforms require accept() serialization, some don't.. */
pthread_mutex_lock(&accept_mutex);
rc = FCGX_Accept_r(&request);
pthread_mutex_unlock(&accept_mutex);
if (rc < 0) {
printf("failed accept: %d\n", rc);
break;
}
server_name = FCGX_GetParam("SERVER_NAME", request.envp);
FCGX_FPrintF(request.out,
"Content-type: text/html\r\n"
"\r\n"
"<title>FastCGI Hello! (multi-threaded C, fcgiapp library)</title>"
"<h1>FastCGI Hello! (multi-threaded C, fcgiapp library)</h1>"
"Thread %d, Process %ld<p>"
"Request counts for %d threads running on host <i>%s</i><p><code>",
thread_id, pid, THREAD_COUNT, server_name ? server_name : "?");
sleep(2);
pthread_mutex_lock(&counts_mutex);
++counts[thread_id];
for (i = 0; i < THREAD_COUNT; i++)
FCGX_FPrintF(request.out, "%5d " , counts[i]);
pthread_mutex_unlock(&counts_mutex);
FCGX_Finish_r(&request);
}
return NULL;
}
int main(void)
{
int i;
pthread_t id[THREAD_COUNT];
FCGX_Init();
umask(0);
FCGX_OpenSocket("/tmp/fcgi.sock", 10);
for (i = 1; i < THREAD_COUNT; i++)
pthread_create(&id[i], NULL, doit, (void*)i);
doit(0);
return 0;
}
你猜怎么着:
# gcc fcgi.c -lpthread -lfcgi
# ./a.out
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -failed accept: -88
谁能指出我做错了什么?
谢谢!
更新:
有趣的是这里 https://habrahabr.ru/post/154187/ 中的示例有效。而且我看不出有什么区别。
问题是他们在示例中使用
FCGX_InitRequest(&request, 0, 0);
而第二个参数必须是socket id。很好的例子,伙计们。
我正在用 C++ 编写一个 fastcgi 应用程序,并且正在努力解决 FCGX_Accept_r() 退出而不阻塞 return 值为“-88”的问题。经过大量谷歌搜索后,我发现您必须正确初始化 FCGX 结构,更正 uds 套接字上的 umask,不要忘记 FCGX_Init() 并检查 FCGX_Init 的 return 代码() 和 FCGX_InitRequest().
我已经为我的程序完成了以上所有工作,但结果还是一样。
所以我尝试从这里的 fcgi 站点构建示例 C 应用程序:http://www.fastcgi.com/devkit/examples/threaded.c 它立即退出。
奇怪的是他们那里没有任何插座。所以我添加了几行 - 打印出 FCGX_Accept_() return 值并打开一个 uds 套接字。
这是结果代码:
/*
* threaded.c -- A simple multi-threaded FastCGI application.
*/
#ifndef lint
static const char rcsid[] = "$Id: threaded.c,v 1.9 2001/11/20 03:23:21 robs Exp $";
#endif /* not lint */
#include "fcgi_config.h"
#include <pthread.h>
#include <sys/types.h>
#include <sys/stat.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <stdio.h>
#include "fcgiapp.h"
#define THREAD_COUNT 20
static int counts[THREAD_COUNT];
static void *doit(void *a)
{
int rc, i, thread_id = (int)a;
pid_t pid = getpid();
FCGX_Request request;
char *server_name;
FCGX_InitRequest(&request, 0, 0);
for (;;)
{
static pthread_mutex_t accept_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t counts_mutex = PTHREAD_MUTEX_INITIALIZER;
/* Some platforms require accept() serialization, some don't.. */
pthread_mutex_lock(&accept_mutex);
rc = FCGX_Accept_r(&request);
pthread_mutex_unlock(&accept_mutex);
if (rc < 0) {
printf("failed accept: %d\n", rc);
break;
}
server_name = FCGX_GetParam("SERVER_NAME", request.envp);
FCGX_FPrintF(request.out,
"Content-type: text/html\r\n"
"\r\n"
"<title>FastCGI Hello! (multi-threaded C, fcgiapp library)</title>"
"<h1>FastCGI Hello! (multi-threaded C, fcgiapp library)</h1>"
"Thread %d, Process %ld<p>"
"Request counts for %d threads running on host <i>%s</i><p><code>",
thread_id, pid, THREAD_COUNT, server_name ? server_name : "?");
sleep(2);
pthread_mutex_lock(&counts_mutex);
++counts[thread_id];
for (i = 0; i < THREAD_COUNT; i++)
FCGX_FPrintF(request.out, "%5d " , counts[i]);
pthread_mutex_unlock(&counts_mutex);
FCGX_Finish_r(&request);
}
return NULL;
}
int main(void)
{
int i;
pthread_t id[THREAD_COUNT];
FCGX_Init();
umask(0);
FCGX_OpenSocket("/tmp/fcgi.sock", 10);
for (i = 1; i < THREAD_COUNT; i++)
pthread_create(&id[i], NULL, doit, (void*)i);
doit(0);
return 0;
}
你猜怎么着:
# gcc fcgi.c -lpthread -lfcgi
# ./a.out
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -88
failed accept: -failed accept: -88
谁能指出我做错了什么? 谢谢!
更新:
有趣的是这里 https://habrahabr.ru/post/154187/ 中的示例有效。而且我看不出有什么区别。
问题是他们在示例中使用
FCGX_InitRequest(&request, 0, 0);
而第二个参数必须是socket id。很好的例子,伙计们。