Skip to content

Instantly share code, notes, and snippets.

@turkerali
Forked from dermesser/libfcgi-example.c
Created April 10, 2022 11:23
Show Gist options
  • Save turkerali/a067a14433665c0a233b3bea47f57e97 to your computer and use it in GitHub Desktop.
Save turkerali/a067a14433665c0a233b3bea47f57e97 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);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment