c - FastCGI 在 c 中的分支

标签 c pthreads fork fastcgi preforking

我目前正在开发高负载项目,需要使用C/FastCGI/nginx组合。

问题是,我需要我的 FastCGI 应用程序在线程/进程中运行。

我知道有两种方法可以做到这一点:

1)编译程序,然后使用spawn-fcgi来fork进程。 (这个我用不了)

2) 运行FCGX_Init(),然后在 while (FCGX_Accept_r(&request) >= 0) 之前预 fork 10 个进程

3) 在 while (FCGX_Accept_r(&request) >= 0) 之后运行 pthreads

所以,我的问题是:whis 是运行 fastcgi 应用程序的最快方法。我可以在此之后预 fork fastcgi 应用程序吗:

int sock = FCGX_OpenSocket(":9000", 10);
FCGX_InitRequest(&request, sock, 0);

可以 10 个进程监听单个套接字吗?如果我有 N 个进程正在运行,我是否必须使用线程?这样就够了吗?

最佳答案

我不知道您具体使用的 FastCGI API,但一般来说,您不能将文件描述符(即套接字)传递给另一个进程,除非它在 fork 之前打开。进程有独立的文件描述符表。线程将共享相同的文件描述符表,因为它们位于同一进程中。

据我所知,一次只能有一个进程在端口上监听。通常所做的事情是有一个线程,其唯一的工作就是监听连接。当它得到一个时,连接被接受并交给池中的下一个工作线程,通过让线程接管接受的套接字(而不是监听套接字)直到套接字关闭。监听器线程立即返回监听连接。

这应该给您带来最小的开销。

关于c - FastCGI 在 c 中的分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6460756/

相关文章:

c - OpenMP - 临界区 + 缩减

c - 将指向 void* 的指针传递给 pthread_join 的目的是什么?

c - 在 C 中类型转换 pthread 的返回值时出现意外结果

linux - execvp 后 QEMU 无终端输出

multithreading - 线程/ fork 的效率

c - 为什么这个程序会出现运行时错误?

c - 撤消功能在达到游戏初始状态后无法正常工作

c - Pthread 线程创建后立即运行

c - 信号量阻塞 child

C类型无法被正确识别