|
|
|
@ -20,12 +20,19 @@ |
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
*/ |
|
|
|
|
|
|
|
#include <stdio.h> |
|
|
|
#include <socket.h> |
|
|
|
#include <string.h> |
|
|
|
#include <unistd.h> |
|
|
|
#include <stdlib.h> |
|
|
|
#include <fcntl.h> |
|
|
|
|
|
|
|
#include <sys/time.h> |
|
|
|
#include <sys/resource.h> |
|
|
|
#include <sys/types.h> |
|
|
|
#include <sys/wait.h> |
|
|
|
#include <sys/time.h> |
|
|
|
#include <sys/signal.h> |
|
|
|
#include <sys/param.h> |
|
|
|
#include <sys/stat.h> |
|
|
|
#include <sys/mman.h> |
|
|
|
|
|
|
|
#include "server.h" |
|
|
|
#include "logger.h" |
|
|
|
@ -35,25 +42,126 @@ |
|
|
|
|
|
|
|
#include "utils/signalHandling.h" |
|
|
|
|
|
|
|
//#define DEFAULT_SECS 0 |
|
|
|
//#define DEFAULT_USECS (1000000 / HZ) |
|
|
|
#define DEFAULT_SECS 1 |
|
|
|
#define DEFAULT_USECS 0 |
|
|
|
|
|
|
|
void nullhandler() {} |
|
|
|
|
|
|
|
void daemonize(void); |
|
|
|
|
|
|
|
int |
|
|
|
main() |
|
|
|
{ |
|
|
|
Logger logger = new(LoggerSyslog, LOGGER_ERR); |
|
|
|
HttpWorker worker = new(HttpWorker, "my"); |
|
|
|
Server server = new(Server, logger, worker, 11212, SOMAXCONN); |
|
|
|
pid_t pid; |
|
|
|
long psize = sysconf(_SC_PAGESIZE); |
|
|
|
int status; |
|
|
|
int shm; |
|
|
|
int * value; |
|
|
|
|
|
|
|
struct rlimit limit = {RLIM_INFINITY, RLIM_INFINITY}; |
|
|
|
setrlimit(RLIMIT_CPU, &limit); |
|
|
|
|
|
|
|
init_signals(); |
|
|
|
//daemonize(); |
|
|
|
serverRun(server); |
|
|
|
|
|
|
|
delete(&server); |
|
|
|
delete(&worker); |
|
|
|
delete(&logger); |
|
|
|
shm = shm_open("/fooshm", O_RDWR|O_CREAT, S_IRWXU); |
|
|
|
ftruncate(shm, psize); |
|
|
|
|
|
|
|
switch((pid = fork())) { |
|
|
|
case -1: |
|
|
|
break; |
|
|
|
|
|
|
|
case 0: |
|
|
|
{ |
|
|
|
sigset_t block_these, pause_mask; |
|
|
|
struct sigaction s; |
|
|
|
struct itimerval interval; |
|
|
|
|
|
|
|
value = mmap (0, sizeof(int), PROT_READ|PROT_WRITE, |
|
|
|
MAP_SHARED, shm, 0); |
|
|
|
*value = 0; |
|
|
|
|
|
|
|
close(shm); |
|
|
|
|
|
|
|
/* Block SIGALRM */ |
|
|
|
sigemptyset(&block_these); |
|
|
|
sigaddset(&block_these, SIGALRM); |
|
|
|
sigprocmask(SIG_BLOCK, &block_these, &pause_mask); |
|
|
|
|
|
|
|
/* Set up handler for SIGALRM */ |
|
|
|
sigemptyset(&s.sa_mask); |
|
|
|
sigaddset(&s.sa_mask, SIGINT); |
|
|
|
s.sa_flags = 0; |
|
|
|
s.sa_handler = nullhandler; |
|
|
|
if (sigaction(SIGALRM, &s, NULL) < 0) { |
|
|
|
perror("sigaction SIGALRM"); |
|
|
|
exit (1); |
|
|
|
} |
|
|
|
|
|
|
|
interval.it_value.tv_sec = DEFAULT_SECS; |
|
|
|
interval.it_value.tv_usec = DEFAULT_USECS; |
|
|
|
interval.it_interval.tv_sec = DEFAULT_SECS; |
|
|
|
interval.it_interval.tv_usec = DEFAULT_USECS; |
|
|
|
|
|
|
|
setitimer(ITIMER_REAL, &interval, NULL); |
|
|
|
|
|
|
|
// child |
|
|
|
while(!doShutdown) { |
|
|
|
*value = rand() % 10; |
|
|
|
sigsuspend(&pause_mask); |
|
|
|
} |
|
|
|
|
|
|
|
_exit(EXIT_SUCCESS); |
|
|
|
} |
|
|
|
|
|
|
|
default: |
|
|
|
{ |
|
|
|
Logger logger; |
|
|
|
HttpWorker worker; |
|
|
|
Server server; |
|
|
|
|
|
|
|
value = mmap (0, sizeof(int), PROT_READ|PROT_WRITE, |
|
|
|
MAP_SHARED, shm, 0); |
|
|
|
|
|
|
|
shm_unlink("/fooshm"); |
|
|
|
close(shm); |
|
|
|
|
|
|
|
logger = new(LoggerSyslog, LOGGER_ERR); |
|
|
|
worker = new(HttpWorker, "my", value); |
|
|
|
server = new(Server, logger, worker, 11212, SOMAXCONN); |
|
|
|
|
|
|
|
//daemonize(); |
|
|
|
serverRun(server); |
|
|
|
|
|
|
|
do { |
|
|
|
pid_t w; |
|
|
|
|
|
|
|
w = waitpid(pid, &status, WUNTRACED | WCONTINUED); |
|
|
|
|
|
|
|
if (w == -1) { |
|
|
|
perror("waitpid"); |
|
|
|
exit(EXIT_FAILURE); |
|
|
|
} |
|
|
|
|
|
|
|
if (WIFEXITED(status)) { |
|
|
|
printf("exited, status=%d\n", WEXITSTATUS(status)); |
|
|
|
} else if (WIFSIGNALED(status)) { |
|
|
|
printf("killed by signal %d\n", WTERMSIG(status)); |
|
|
|
} else if (WIFSTOPPED(status)) { |
|
|
|
printf("stopped by signal %d\n", WSTOPSIG(status)); |
|
|
|
} else if (WIFCONTINUED(status)) { |
|
|
|
printf("continued\n"); |
|
|
|
} |
|
|
|
} while (!WIFEXITED(status) && !WIFSIGNALED(status)); |
|
|
|
|
|
|
|
delete(&server); |
|
|
|
delete(&worker); |
|
|
|
delete(&logger); |
|
|
|
} |
|
|
|
|
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
|