- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前正在尝试实现一个在 Linux 上运行的小型 FastCGI 多线程应用程序。我使用来自 fastcgi.com 的库.现在我不确定我是否真的理解 web 服务器和我的应用程序之间的 FCGI 通信是如何工作的概念。
首先,我在我的应用程序中创建了一个新套接字。我返回文件描述符。
int socketIn = 0;
struct sockaddr_un local;
int length = 0;
int value = 1;
memset(&local, 0, sizeof(local));
local.sun_family = AF_UNIX;
strcpy(local.sun_path, socketPath);
length = strlen(local.sun_path) + sizeof(local.sun_family);
/* delete old unix socket */
if(-1 == unlink(socketPath))
{
switch (errno)
{
case ENOENT:
{
}break;
default:
{
printf("\n[Error]\tCould not remove old socket.");
return -1;
}
}
}
/* create new socket */
if (-1 == (socketIn = socket(AF_UNIX, SOCK_STREAM, 0)))
{
printf("\n[Error]\tCould not create socket.");
return -2;
}
/* bind socket */
if (-1 == bind(socketIn, (struct sockaddr *)&local, length))
{
printf("\n[Error]\tCould not bind socket.");
return -4;
}
return socketIn;
之后我初始化 FCGI 库:FCGX_Init();
现在我开始创建我的线程:
#define THREAD_COUNT 2
static int counts[THREAD_COUNT];
struct thread_data{
int thread_id;
int fcgiSocket;
};
struct thread_data thread_data_array[THREAD_COUNT];
int main(int argc, char** argv)
{
int i;
pthread_t id[THREAD_COUNT];
for (i = 1; i < THREAD_COUNT; i++)
{
thread_data_array[i].thread_id = i;
thread_data_array[i].fcgiSocket = fcgi.fcgiSocket;
pthread_create(&id[i], NULL, doit, &thread_data_array[i]);
}
thread_data_array[0].thread_id = 0;
thread_data_array[0].fcgiSocket = fcgi.fcgiSocket;
doit((void *)&thread_data_array[0]);
return 0;
}
最后是我的线程代码:
static void *doit(void *a)
{
struct thread_data *my_data;
my_data = (struct thread_data *) a;
int rc, i;
pid_t pid = getpid();
FCGX_Request request;
char *server_name;
FCGX_InitRequest(&request, my_data->fcgiSocket, 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)
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>",
my_data->thread_id, pid, THREAD_COUNT, server_name ? server_name : "?");
pthread_mutex_lock(&counts_mutex);
++counts[my_data->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;
}
现在我担心我使用的套接字。 3 个线程都将写入同一个套接字。使用多线程 FCGI 应用程序是否有其他或更好的方法来解决这个问题?
最佳答案
我正在回复旧帖子,但也许其他人可以从中受益。
"Now I'm worried about the socket I use. The 3 threads will all write to the same socket."
不用担心!
根据Fast CGI规范,每个请求都有关联的ID,当线程将响应写回socket时,它会关联其服务的请求的ID。因此,即使线程以不同的顺序写入,Web 服务器也知道哪个响应是针对哪个请求的。规范在这里-
http://www.fastcgi.com/drupal/node/6?q=node/22
并且只要消息的大小小于 PIPE_BUF,就保证对套接字的写入是原子的。并且 libfcgi 将写入大小限制为 PIPE_BUF。您可以在以下文件中查看 -
http://www.fastcgi.com/mod_fastcgi/mod_fastcgi.h
#define FCGI_MAX_MSG_LEN PIPE_BUF
希望这个解释能解开疑惑!
关于c++ - 对 FCGI 概念感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14211689/
我正在尝试学习Rust。我正在阅读一本书online,该书实现了unix程序cat。现在,我试图读取作为像cargo run file1.txt file2.txt这样的参数传递的文件的内容,但是程序
我在 GHC 8.0.1 中遇到了一个带有种类索引 (?) GADT 的奇怪情况,其中在类型与种类签名中引入 foralls 会产生不同的类型检查行为。 考虑以下数据类型: {-# LANGUAGE
我正在使用 Perl 5.10 开发应用程序,HTML::Mason和 Apache 2.2。这是我第一次在大型项目中使用 Perl 5.10。我每隔一段时间就会出现奇怪的行为。应用程序因一个非常奇怪
我正在尝试将文件上传到aws中的rust中,因为我使用的是 rusoto_s3 的s3 rust客户端,当这些部分从单个线程发送时,我设法使分段上传代码正常工作不是我想要的,我想上传大文件,并且希望能
我是一名优秀的程序员,十分优秀!