美文网首页
FCGI多线程例子

FCGI多线程例子

作者: 温暖春阳 | 来源:发表于2018-02-09 16:02 被阅读373次

因为需要就看了一下FCGI多线程例子,下面直接来看FCGI提供给我们的多线程例子吧。

/*
 * 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>

#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif

#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;  //定义一个request变量,包含了输入输出。
    char *server_name;

    FCGX_InitRequest(&request, 0, 0);  //初始化request

    char *querystring = FCGX_GetParam("QUERY_STRING", request.envp);     //得到获取数据的长度
    long  len = strtol(contentLength, NULL, 10);    //将contentLength转换为十进制long类型
    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)
            break;

        server_name = FCGX_GetParam("SERVER_NAME", request.envp); //从环境变量中获取server_name 
      //输出
        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);
      //释放掉request
        FCGX_Finish_r(&request);
    }

    return NULL;
}

int main(void)
{
    int i;
    pthread_t id[THREAD_COUNT];

    FCGX_Init();  //初始化
  
    for (i = 1; i < THREAD_COUNT; i++)
        pthread_create(&id[i], NULL, doit, (void*)i);

    doit(0);

    return 0;
}

在 FCGX中我们要使用FCGX_GetChar(request.in); 来获取标准输入中的数据。
FCGX将标准输入输出标准错误重定向的这个结构体中

typedef struct FCGX_Request {
    int requestId;            /* valid if isBeginProcessed */
    int role;
    FCGX_Stream *in;     //标准输入 
    FCGX_Stream *out;   //标准输出
    FCGX_Stream *err;   //标准错误
    char **envp;   //环境变量

    /* Don't use anything below here */

    struct Params *paramsPtr;
    int ipcFd;               /* < 0 means no connection */
    int isBeginProcessed;     /* FCGI_BEGIN_REQUEST seen */
    int keepConnection;       /* don't close ipcFd at end of request */
    int appStatus;
    int nWriters;             /* number of open writers (0..2) */
    int flags;
    int listen_sock;
    int detached;
} FCGX_Request;

当我们想要从标准输入中读取数据时可以使用
DLLAPI int FCGX_GetChar(FCGX_Stream *stream);
函数来读取数据,一次只会读取一个字符。

相关文章

  • FCGI多线程例子

    因为需要就看了一下FCGI多线程例子,下面直接来看FCGI提供给我们的多线程例子吧。 在 FCGX中我们要使用FC...

  • go http服务器/客户端

    服务器端简单例子: 客户端简单例子 贴吧单线程爬取例子 贴吧多线程爬虫简单例子 多线程爬取多个页面例子

  • iOS 多线程NSThread,GCD,NSOperation

    单例模式例子: https://github.com/XiaoRuiZuo/Singleton 多线程:多线程是为...

  • Python多线程例子

    Python中一个多线程的例子写这个例子是为了加强记忆,方便理解

  • 多线程(售票例子)

  • python多线程重入陷阱

    多线程使用容易出现重入问题,有时这种重入不易发觉,我们一起看下面这个例子: 上面这个例子中,多线程类调用了一个类A...

  • FASTCGI

    六、安装spawn-fcgi来运行php-cgi yum install spawn-fcgi 七、下载spawn...

  • 多线程模拟银行出纳和管理过程

    这个例子来自java编程思想,模拟了银行出纳的多线程场景

  • Future模式

    概述: 说到多线程的future,百度 多线程 future,网上也有各式各样的例子,写的比我还要好,但是实在是这...

  • centos 安装 uwsgi

    基于python的web项目,常见的部署方法有:fcgi:用spawn-fcgi或者框架自带的工具对各个proje...

网友评论

      本文标题:FCGI多线程例子

      本文链接:https://www.haomeiwen.com/subject/pvzftftx.html