fastcgi c/c++多线程编程

源代码

/*
 * 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"
#include <string.h>
#include  <stdio.h>


#define THREAD_COUNT 20

static int counts[THREAD_COUNT];
static int counter = 0;
static void *thread_name1_1(void *arg)
{
    char tmp_buf[1024]; 
    char *server_name=NULL;
       char *content_length=NULL;
       char *query_string=NULL;
    char *http_useragent=NULL;
    char *request_method=NULL;
    char *content_type=NULL;
    char *path_info=NULL;
    char *script_name=NULL;
    pid_t pid = getpid();
    unsigned int pthread_id = (unsigned int)pthread_self();
    FCGX_Request *request=NULL;
    request = (FCGX_Request *)arg;
    //memset(&request,0,sizeof(FCGX_Request));
    //memcpy(&request,(FCGX_Request *)arg,sizeof(FCGX_Request));
    
    request_method = FCGX_GetParam("REQUEST_METHOD", request->envp);
    server_name = FCGX_GetParam("SERVER_NAME", request->envp);
    content_length = FCGX_GetParam("CONTENT_LENGTH", request->envp);
    query_string = FCGX_GetParam("QUERY_STRING", request->envp);
    http_useragent = FCGX_GetParam("HTTP_USER_AGENT", request->envp);
    content_type = FCGX_GetParam("CONTENT_TYPE", request->envp);
    content_type = FCGX_GetParam("PATH_INFO", request->envp);
    script_name = FCGX_GetParam("SCRIPT_NAME", request->envp);
    
    memset(tmp_buf,0,sizeof(tmp_buf));
    sleep(5);
    if(0 == strcmp(query_string,"name1=1"))
    {
        snprintf(tmp_buf,sizeof(tmp_buf),\
                    "Content-type: text/html\r\n\r\n" 
                    "<title>FastCGI Hello!</title>"     
                    "<h1>caoft1</h1>"             
                    "<h1>request_method:%s</h1>" 
                    "<h1>server_name:%s</h1>" 
                    "<h1>content_length:%s</h1>" 
                    "<h1>query_string:%s</h1>" 
                    "<h1>http_useragent:%s</h1>" 
                    "<h1>content_type:%s</h1>" 
                    "<h1>pid:%d</h1>" 
                    "<h1>thread_id:%d</h1>" 
                    "<h1>counter:%d</h1>"
                    "<h1>path_info:%s</h1>"
                    "<h1>script_name:%s</h1>"
                ,request_method,\
                server_name,\
                content_length,\
                query_string,\
                http_useragent,\
                content_type,\
                pid,pthread_id,counter,\
                path_info,script_name);
    }
    else if(0 == strcmp(query_string,"name1=2"))
    {
        snprintf(tmp_buf,sizeof(tmp_buf),\
                    "Content-type: text/html\r\n\r\n" 
                    "<title>FastCGI Hello!</title>"     
                    "<h1>caoft2</h1>"             
                    "<h1>request_method:%s</h1>" 
                    "<h1>server_name:%s</h1>" 
                    "<h1>content_length:%s</h1>" 
                    "<h1>query_string:%s</h1>" 
                    "<h1>http_useragent:%s</h1>" 
                    "<h1>content_type:%s</h1>" 
                    "<h1>pid:%d</h1>" 
                    "<h1>thread_id:%d</h1>" 
                    "<h1>counter:%d</h1>"
                    "<h1>path_info:%s</h1>"
                    "<h1>script_name:%s</h1>"
                ,request_method,\
                server_name,\
                content_length,\
                query_string,\
                http_useragent,\
                content_type,\
                pid,pthread_id,counter,\
                path_info,script_name);
    }
    else
    {
        snprintf(tmp_buf,sizeof(tmp_buf),\
                    "Content-type: text/html\r\n\r\n" 
                    "<title>FastCGI Hello!</title>"     
                    "<h1>caoft0</h1>"             
                    "<h1>request_method:%s</h1>" 
                    "<h1>server_name:%s</h1>" 
                    "<h1>content_length:%s</h1>" 
                    "<h1>query_string:%s</h1>" 
                    "<h1>http_useragent:%s</h1>" 
                    "<h1>content_type:%s</h1>" 
                    "<h1>pid:%d</h1>" 
                    "<h1>thread_id:%d</h1>" 
                    "<h1>counter:%d</h1>"
                    "<h1>path_info:%s</h1>"
                    "<h1>script_name:%s</h1>"
                ,request_method,\
                server_name,\
                content_length,\
                query_string,\
                http_useragent,\
                content_type,\
                pid,pthread_id,counter,\
                path_info,script_name);
    }
    FCGX_FPrintF(request->out,tmp_buf);
    FCGX_Finish_r(request);  
    //sleep(5);
    pthread_exit(NULL);
}

static int doit(void )
{
    FCGX_Request request[THREAD_COUNT];
    pthread_t tid[THREAD_COUNT];
    char *query_string=NULL;
    int rc = 0;
    
    for (;;)
    {

        FCGX_InitRequest(&request[counter], 0, 0);    
        rc = FCGX_Accept_r(&request[counter]);

        if (rc < 0)
        {
            return -1;
        }

        rc = pthread_create(&tid[counter], NULL, thread_name1_1, (void*)&request[counter]);
        if(rc != 0)
        {
            return -1;
        }
        counter ++;
        if(counter >= THREAD_COUNT)
        {
            counter = 0;
        }
    }

    return 0;
}

int main(void)
{
    FCGX_Init();
    doit();
    return 0;
}

 

编译方式

gcc -o caoft.fcgi threaded.c -lpthread -lfcgi

验证方式

http://自己的ip/cgi-bin/caoft.fcgi?name1=1

http://自己的ip/cgi-bin/caoft.fcgi?name1=2

http://自己的ip/cgi-bin/caoft.fcgi

 

验证方式

https://download.csdn.net/download/caofengtao1314/10560484

请用次blog代码替换掉下载代码中cgi-bin目录下的代码

转载请注明博主

https://mp.csdn.net/postedit/81286960

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的日志信息,可以看出出现了关于 upstream 和 fastcgi 的错误。这种情况通常表示 Zabbix Web 无法连接到 FastCGI 进程或者 FastCGI 进程无法正常工作。以下是一些可能的解决方法: 1. 检查 FastCGI 进程是否正在运行:使用以下命令检查 FastCGI 进程的状态: ``` sudo systemctl status php-fpm ``` 如果进程未运行,请使用以下命令启动它: ``` sudo systemctl start php-fpm ``` 2. 检查 FastCGI 配置:确认 FastCGI 进程的配置文件是否正确。通常该文件位于 `/etc/php-fpm.d/` 目录下。检查配置文件中的监听地址和端口是否与 Zabbix Web 的配置相匹配。 3. 检查端口是否被占用:使用以下命令检查 FastCGI 进程所使用的端口是否被其他进程占用: ``` sudo netstat -tuln | grep 9000 ``` 如果端口已被占用,你可以尝试更改 FastCGI 进程的监听端口,并确保 Zabbix Web 的配置文件中相应的端口也做相应修改。 4. 检查防火墙设置:如果你的服务器启用了防火墙,请确保允许请求通过 FastCGI 端口(默认为 9000)。你可以使用以下命令添加防火墙规则: ``` sudo firewall-cmd --zone=public --add-port=9000/tcp --permanent sudo firewall-cmd --reload ``` 5. 检查 SELinux 设置:如果你的服务器启用了 SELinux,它可能会限制 FastCGI 进程的访问。可以尝试禁用 SELinux 或者修改其策略以允许 FastCGI 进程的访问。 请根据具体情况逐一尝试这些解决方法,并确保你的配置和设置正确。如果问题仍然存在,你可能需要进一步检查服务器环境、Zabbix Web 和 PHP-FPM 的配置,并参考相关文档或社区寻求更多帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值