Skip to content

Instantly share code, notes, and snippets.

@dermesser
Created July 3, 2014 11:14
Show Gist options
  • Star 10 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save dermesser/e2f9b66457ae19ebd116 to your computer and use it in GitHub Desktop.
Save dermesser/e2f9b66457ae19ebd116 to your computer and use it in GitHub Desktop.
In case anyone wants to see a multi-threaded FastCGI application written with the fcgiapp library.
# include <stdlib.h>
# include <stdio.h>
# include <sys/stat.h>
# include <pthread.h>
# include <fcgiapp.h>
const char* const sockpath = "/tmp/fcgicpp.sock";
void* start_fcgi_worker(void* arg);
struct FCGI_Info
{
int fcgi_fd;
};
int main(void)
{
int fcgifd = FCGX_OpenSocket(sockpath,128);
chmod(sockpath,0777);
if ( 0 > fcgifd )
{
printf("Error opening socket\n");
exit(1);
}
/*
if ( FCGX_IsCGI() )
{
printf("Please run this process as FastCGI process.\n");
exit(1);
}
*/
const unsigned int n_threads = 4;
pthread_t threads[n_threads];
struct FCGI_Info info;
info.fcgi_fd = fcgifd;
for ( unsigned int i = 0; i < n_threads; i++ )
{
pthread_create(&threads[i],NULL,start_fcgi_worker,(void*)&info);
}
// Wait indefinitely
for ( unsigned int i = 0; i < n_threads; i++ )
{
pthread_join(threads[i],NULL);
}
return 0;
}
void* start_fcgi_worker(void* arg)
{
struct FCGI_Info* info = (struct FCGI_Info*)arg;
FCGX_Init();
FCGX_Request request;
FCGX_InitRequest(&request,info->fcgi_fd,0);
while ( 1 )
{
FCGX_Accept_r(&request);
FCGX_PutStr("Content-type: text/plain\r\n\r\n",28,request.out);
FCGX_PutStr("Hey!\n",5,request.out);
FCGX_Finish_r(&request);
}
}
@bwillcox
Copy link

bwillcox commented May 5, 2022

Locking around calls to FCGX_Accept_r seem unnecessary. The header file says "(multi-thread safe)".

@dermesser
Copy link
Author

Thank you all for your comments! They are really helpful :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment