【问题标题】:FCGX_Accept_r fails with -88 return codeFCGX_Accept_r 失败,返回码 -88
【发布时间】:2016-06-05 02:58:15
【问题描述】:

我正在用 c++ 编写一个 fastcgi 应用程序,并且正在努力解决 FCGX_Accept_r() 退出而没有阻塞,返回值为“-88”。经过大量谷歌搜索后,我发现您必须正确初始化 FCGX 结构,更正 uds 套接字上的 umask,不要忘记 FCGX_Init() 并检查 FCGX_Init() 和 FCGX_InitRequest() 的返回码。

我已经为我的程序完成了上述所有操作,但结果仍然相同。

所以我尝试从 fcgi 站点构建示例 C 应用程序:http://www.fastcgi.com/devkit/examples/threaded.c 它立即退出。

奇怪的是他们没有打开任何套接字。所以我添加了几行 - 打印出 FCGX_Accept_() 返回值并打开一个 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/ 有效。而且我看不出有什么不同。

【问题讨论】:

    标签: c sockets fastcgi


    【解决方案1】:

    问题是在示例中他们使用了

    FCGX_InitRequest(&request, 0, 0);
    

    而第二个参数必须是socket id。很好的例子,伙计们。

    【讨论】:

    • 奇怪的事情:FCGX_Init(); FCGX_InitRequest(&request, 0, 0);这工作了一段时间,但停止工作......
    • 我猜套接字 id 过去可能恰好是零,但现在不是。
    • 那么你把socket id设置成什么了?多年来我一直像示例一样运行它,运行良好今天我为新的 Ubuntu 安装重新编译了 FCGI 服务器,并且像你一样在接受时得到 -88。
    • FCGX_OpenSocket() 的结果;
    • 0 作为 FCGX_InitRequest 的第二个参数是完全有效的,默认情况下它是 STDIN 的文件号。例如,如果您想打开一个 UNIX 域套接字,请使用套接字文件的 pathbacklog(例如 128)调用 FCGX_OpenSocket。它返回调用 FCGX_InitRequest 时可以使用的文件号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 2014-02-01
    • 1970-01-01
    • 2012-08-12
    相关资源
    最近更新 更多