spwan-fcgi和fcgi 关系

article/2025/10/18 21:32:21

spwan-fcgi:

举个例子: spawn-fcgi -a 127.0.0.1 -p 10000 -f ./login

spwan-fcgi.c: main 函数 会执行参数解析过程 获得 ip 端口 和 执行文件的路径。

bind_socket 函数会执行 sockt 的 绑定监听过程,

函数 fcgi_spawn_connection 会通过系统调用dup2将 listen的 socket 重定向到FCGI_LISTENSOCK_FILENO,并关闭原来的listen socket.

然后fork的子进程都会共享这个FCGI_LISTENSOCK_FILENO 句柄。 fork的子进程会通过系统调用execl 或 execv, 替换成cgi程序(./login, sh -c ./login)  

(用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时,该进程被完全替换为新程序。因为调用exec函数并不创建新进程,所以前后进程的ID并没有改变。)

cgi 程序 通常会通过   while (FCGI_Accept() >= 0) 等待 连接进来。FCGI_Accept是  fast cgi的函数。

fcgi:

FCGX_Accept : 

首先会调用

int FCGX_Accept(
        FCGX_Stream **in,
        FCGX_Stream **out,
        FCGX_Stream **err,
        FCGX_ParamArray *envp)

会进行 FCGI的初始化 ,然后也将FCGI_LISTENSOCK_FILENO赋予linsten_socket. FCGI_LISTENSOCK_FILENO fcgi和spwan-fcgi的定义是一样的都是0,这样cgi程序也就和 spwan-fcgi一样获得了 对ip 和端口 对应的 listen fd。

 

 FCGX_Accept_r:

reqDataPtr->ipcFd = OS_Accept(reqDataPtr->listen_sock, fail_on_intr, webServerAddressList);

 OS_Accept 会接受新的连接, OS_Accept 里面会加锁,多进程的文件锁,对listen_sockt(FCGI_LISTENSOCK_FILENO)加写锁,那个进程获取了锁 就去处理这个连接

(fcntl系统调用可以用来对已打开的文件描述符进行各种控制操作以改变已打开文件的的各种属性,主要作用可以用来对文件描述符加锁

F_SETLKW:行为如同F_SETLK,除了不能获取锁时会睡眠等待外。如果在等待的过程中接收到信号,会立即返回并将errno置为EINTR。

F_WRLC 写锁)

接受新的连接后 FillBuffProc进行阻塞读,并将内容写入到链表中,相当于用户层的buffer 全部写入 

reqDataPtr->in = NewReader(reqDataPtr, 8192, 0); (这个in 很重要)

 FillBuffProc(reqDataPtr->in);
 

 

 

CGI程序数据的读取

回到FCGX_Accept(), 会将FCGI_stdin->fcgx_stream = in;

in就是上面提到的

reqDataPtr->in = NewReader(reqDataPtr, 8192, 0); (这个in 很重要)

 FillBuffProc(reqDataPtr->in);

cgi程序读取数据 会从FCGI_stdin->fcgx_stream 读取数据。

 fread,  ret = fread(buf, 1, len, stdin); //从标准输入(web服务器)读取内容

首先这个 fread 是指FCGI_fread stdin是指FCGI_stdin (fcgi_stdio.h)

#undef  fread
#define    fread    FCGI_fread

#undef  stdin
#define    stdin    FCGI_stdin

FCGI_fread 就是从缓冲区中读取数据

 

 

 


http://chatgpt.dhexx.cn/article/iDG2NL2f.shtml

相关文章

nginx+spawn-fcgi+demo+fcgi库函数

由于项目中用到了nginxFastCGI相关内容,所以这段时间学习了一下,顺便记下相关内容。 我是在远程工作机上实验的,有个缺点就是没有root权限,所以有些步骤我就没做了,比如make install(nginx)、添…

【fcgi-2.4.0】移植fcgi-2.4.0到armv7平台

源码下载链接 Index of /lookaside/extras/fcgi/fcgi-2.4.0.tar.gz/d15060a813b91383a9f3c66faf84867e (fedoraproject.org)https://src.fedoraproject.org/lookaside/extras/fcgi/fcgi-2.4.0.tar.gz/d15060a813b91383a9f3c66faf84867e/下载fcgi-2.4.0.tar.gz 解压源码 tar …

程序异常捕获库 - CrashRpt

CrashRpt.dll用来在应用程序出现异常crash时,捕获到错误,并收集出错信息:MiniDump文件、硬件信息、系统信息、出错信息、进程信息、服务信息、驱动信息、启动信息、软件列表、端口信息、磁盘分区、WinSock LSP、IE插件、网卡信息。 1、使用方…

CrashRpt.dll用来在应用程序出现异常crash

欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c 编程经验,就来吧!158427611 欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c 编程经验,就来吧&a…

crashRpt使用方法

从官网上下载crashRpt的源码,按说明编译出相应的lib和dll 1 在编译crashRpt的时候,在环境变量中设置 crashrptDirD:\work\AIW\WebMicaps\WebMicapsServer\src\CrashRpt,以简化编译 2 在主程序运行的工作目录下要拷贝crashRpt编译后生成…

CrashRpt使用

CrashRpt 中除了错误处理之外值得学习的地方还是不少的,如屏幕截图、邮件 发送。 这里主要提取屏幕截图的功能。 1. 从 CrashRpt 源码目录中分别复制 minizip 、 zlib 、 libpng 到一个目录作为公 共库使用,并分别编译它们生成 lib ,需要设置…

crashRpt用法

从官网上下载crashRpt的源代码,按说明编译出对应的lib和dll 1 在编译crashRpt的时候,在环境变量中设置 crashrptDirD:\work\AIW\WebMicaps\WebMicapsServer\src\CrashRpt,以简化编译 2 在主程序执行的工作文件夹下要拷贝crashRpt编译后生…

捕获Windows C/C++程序异常奔溃工具CrashRpt

背景 在Windows环境下做C/C程序开发有段时间了,经常遇到程序奔溃时缺无法捕获,经同事推荐,知道了CrashRpt这个捕获C/C程序异常的工具,让我省去了通过增加打印调试去查询程序异常的繁琐方式。下面记录下使用这个工具的一些方法。 …

关于CrashRpt的研究

CrashRpt是轻量级的开源错误报告库 官网下载链接 ##编译工程 从官网下载下最新版(v.1.4.3_r1645),解压后发现是visual studio的工程,使用的是vs2010。但我用得是vs2017,所以在编译之前要做一下处理: 对于…

C++接入CrashRpt并上报分析崩溃信息

项目需要监测在Windows平台的崩溃情况,折腾了两天终于弄好了,记录一下。 1.捕获崩溃信息 接到这个需求,心想应用崩溃系统会收到信号,应该有相应的函数可以监听,上网搜索,果不其然函数 SetUnhandledExcep…

计算机中丢失crashrpt,修复crashrpt.dll

crashrpt.dll是电脑系统必备的一个DLL组件修复程序。系统重要文件 crashrpt.dll 。crashrpt.dll(含64位)在电脑中起着重要作用。比如电脑中的部分软件的正常运行就离不开它,如果缺少这款dll,会给用户带来不少麻烦。一旦发现自己的电脑这款crashrpt.dll出…

计算机中丢失crashrpt,crashrpt.dll

crashrpt.dll是smartFTP中一款重要的dll文件,缺少它将导致软件的部分功能无法实现或者无法启动,如果计算机弹出crashrpt.dll丢失或者找不到crashrpt.dll的问题,下载一个crashrpt.dll文件修复一下即可解决问题,需要的朋友可以下载&…

crashrpt

今天原本打算在谷歌上搜索处理SEH的文章,以使我不需要在每一个线程中使用__try{}__except()代码块包裹代码的情况下,就能在任意线程抛出SEH时生成MiniDump文件。不过最后的结果是处理SEH的文章没有搜索出几篇,却幸运的搜索出了满足我需要的工…

Windows平台崩溃转储系统crashrpt的使用

概述 CrashRpt 是一个免费的、轻量级的开源错误报告库开源库,旨在拦截C程序中的异常,收集有关崩溃的技术信息并通过互联网向软件供应商发送错误报告,用于在 Microsoft Visual Studio IDE 中创建并在 Windows 中运行C应用程序。(不…

Android APK及签名

APK是AndroidPackage的缩写,即Android安装包(apk)。APK是类似Symbian Sis或Sisx的 文件格式。通过将APK文件直接传到 Android模拟器或Android手机中执行即可安装。apk文件和sis一样,把 android sdk编译的工程打包成一个安装程序文件,格式为ap…

安卓应用签名

安卓应用release模式是需要签名的,否则无法安装,debug模式不需要的 签名可以用keytool生成密钥文件,然后在build.gradle中指定即可。 一、生成密钥文件 keytool -genkey -alias noalias -keypass abcd1234 -keyalg RSA -keysize 2048 -valid…

Android为App签名(为apk签名)

写博客是一种快乐,前提是你有所写,与人分享,是另一种快乐,前提是你有舞台展示,CSDN就是这样的舞台。 这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但…

AndroidStudio应用签名

1、新建存放签名文件的文件夹 Build 2、初次没有账号 点击Create new 创建 3、签名成功后会在build。gradle 生成下面的数据 4、AS中调出黑窗口写入 keytool -list -v -keystore “L:/boxin/bx.jks” 签名地址 输入密码 5、找到MD5 SHA1 后面的密钥就是你的应用签名

android app签名详解

本文及文中图片转自:https://mp.weixin.qq.com/s?__bizMzIwMzYwMTk1NA&mid2247493825&idx1&sne926da39c6bd51397851d7e330d6ba24&chksm96ce498ca1b9c09a7865264b26eadcf27bd012e9acc999b3eb3ca5c440266642763b6be27416&mpshare1&scene23&a…

Android应用签名之AS签名

废话不多说直接上图 如之前未生成jks文件则,点击create new .. 这里只要输入几个必要项 Key store path(生产key文件的保存路径 ) Key store password(key 存储密码) Key alias(key别名) Key p…