webserver<1>
1. 实现基础的信号处理
sigaction使用前一定内存清零
2. 实现基础的进程模型
wait 等待子进程结束
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include "common.h"
#include "serversignal.h"
static volatile sig_atomic_t graceful=0;
int main(int argc, char *argv[])
{
signal_init();
int max_worker= 5;
int child = 0;
while(!graceful&&!child){
if(max_worker>0){
switch(fork()){
case -1:
return -1;
break;
case 0:
child =1;
break;
default:
printf("child creat\n");
max_worker--;
break;
}
}else{
int status =0;
if( -1 != wait(&status)){
max_worker++;
printf("parent wakeup\n");
}
}
} if(!child){
printf("quit kill children first\n");
kill(0, SIGINT);
sleep(20);
}else{
sleep(5);
printf("child quit\n");
} return 0;
}
void server_graceful_set(int g)
{
if(g>0){
g=1;
}else{
g=0;
}
graceful=g;
}
int server_graceful_get()
{
return graceful;
}
#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include "serversignal.h"
#include "server.h"
typedef void (*SIG_HANLDER) (int sig);
struct server_signal{
int sig;
SIG_HANLDER handler;
};
static int signal_handler(int sig);
#define SIG_MAP_GEN(sig, hanlder) {sig, hanlder},
#define SIG_MAP(XX)\
{\
XX(SIGINT, signal_handler)\
XX(SIGHUP, signal_handler)\
XX(0, NULL)\
}\ int signal_init()
{
int index =0;
struct server_signal signals[]=SIG_MAP(SIG_MAP_GEN); while(signals[index].sig != 0){
struct sigaction act;
memset(&act, 0, sizeof(struct sigaction));
act.sa_handler=(signals[index].handler);
sigemptyset(&act.sa_mask);
sigaction(signals[index].sig, &act, NULL);
index++;
}
return 0;
}
static int signal_handler(int sig)
{
int status=0;
switch(sig){
case SIGINT:
server_graceful_set(1);
break;
case SIGHUP:
printf("sighup\n");
break;
case SIGCHLD:
if(server_graceful_get() == 1){
while(wait(&status)>0){};
}
break;
default:
break;
}
return 0;
}
#ifndef COMMON_H_INCLUDED
#define COMMON_H_INCLUDED #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h> typedef enum {
true =,
false =
}boolean; enum logmode{
SERVER_LOG_FILE=,
SERVER_LOG_STDERR
}; struct server{
enum logmode svlogmode;
}; #define ASSERT(p)\
do{\
if(!p){\
printf("assert error at %s , %d .\n", __FILE__, __LINE__);\
}\
}while()\ #endif // COMMON_H_INCLUDED
webserver<1>的更多相关文章
- WebServer+ADO+百万数据查询
很简单的demo,查询速度快,易理解,废话不说 上demo 看完就明白了 源码地址:http://files.cnblogs.com/files/SpadeA/WebDemo.zip 这是关于Web ...
- webserver[实时查询当天的天气情况]
1.webserver是什么? 日常生活中经常会使用到webserver,注册时,会收到验证码,购买东西时,会收到短信,假如,A公司网站和B公司合作,那么A公司注册对的用户可以直接推送给B网站,那怎么 ...
- Warning: file_put_contents(data.txt): failed to open stream: Permission denied in /Library/WebServer/Documents/test.php on line 22
最近在学习PHP 在保存文件的时候报Warning: file_put_contents(data.txt): failed to open stream: Permission denied in ...
- [C#] 图文解说调用WebServer实例
本文旨在实现如何在.NET环境下调用WebServer,以天气接口为例进行说明. WebServer地址:http://www.webxml.com.cn/WebServices/WeatherWeb ...
- python开启简单webserver
python开启简单webserver linux下面使用 python -m SimpleHTTPServer 8000 windows下面使用上面的命令会报错,Python.Exe: No Mod ...
- C# 如何调用WebServer函数
WebServer(ASMX)服务程序网站的编写简单总结. WebServer中遇到的问题 编写WebServer程序VS运行调试时如果出现 System.Data.OracleClient.Orac ...
- [Top-Down Approach] Assignment 1: WebServer [Python]
Today I complete Socket Programming Assignment 1 Web Server Here is the code: #!/usr/bin/python2.7 # ...
- 【监控】WebServer入库与缓存更新代码优化小计
问题描述: 通过WebServer将监控数据入库到Hbase,在入库之前需要将指标与ip的列表更新到缓存中,以便前台页面随时选择查看.前两天上了一些新用户导致负载增加,逐渐发现某些用户的监控场景出现丢 ...
- Linux WebServer WebRoot Path Identification
目录 . HTTPD(Apache) . NGINX . TENGINE . JBOSS . TOMCAT . LIGHTTPD 1. HTTPD(Apache) 0x1: 启动参数 Usage: . ...
- iOS - Apache Tomcat WebServer 服务器配置
前言 提前下载好相关软件,且安装目录最好安装在全英文路径下.如果路径有中文名,那么可能会出现一些莫名其妙的问题. 提前准备好的软件: apache-tomcat-6.0.45.tar.gz eclip ...
随机推荐
- Nothing
破烂的文具盒里,一张十年的纸条子和一袋存了十年的德芙巧克力 浅绿色的纸条子上写是当时你给我抄的作业题目,蓝色清秀的字体 但是十年后,你却已嫁他人 将身后的风雪.夕阳,空气埋葬.窑藏,待非常多年以后酿成 ...
- [Redux] Normalizing the State Shape
We will learn how to normalize the state shape to ensure data consistency that is important in real- ...
- Unity3d + NGUI 多分辨率适应
更多型号适合的移动终端 现在我们要介绍的<链战争>游戏改编方法,这种适应方法UI这是一个基本维度,背景是一个基本的尺寸.背景比UI没有实际影响某一部分的额外部分,这样就避免了适应iPhon ...
- StirngUtil工具类 之 邮箱注冊 域名不区分大写和小写方法
/** * 传入邮箱域名所有变为小写,然后拼接前缀返回 *<b>Summary: </b> * emailDomainTransform() * @param domain * ...
- register_globals(全局变量注册开关)
register_globals,是php.ini文件里面的一个配置选项,接下来,我们可以通过例程来分析一下,当register_globals = on 与 register_globals = o ...
- Install-User.ps1
Install-User.ps1 function Install-User { param( [Parameter()] [string]$ComputerName = $env:computern ...
- 收集SQLServer线程等待信息
要知道线程等待时间是制约SQL Server效率的重要原因,这一个随笔中将学习怎样收集SQL Server中的线程等待时间,类型等信息,这些信息是进行数据库优化的依据. sys.dm_os_wait_ ...
- linux常用命令(自我积累)
创建目录:mkdir + 目录名 使文件可执行:chmod +x filename 执行文件:./filename 来执行您的脚本 {程序必须以下面的行开始(必须方在文件的第一行): #!/bin/s ...
- Shell编程之Shift的用法
位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shift命令相当于shift 1. 非常 ...
- EDM推送
一.需求描述: 日前,做了一个发送客户账单的功能,邮件模板采用自定义,生成vm文件,保存至redis, 采用jodd-mail发送邮件,查询用户账单数据,账单明细,缓存加载模板并渲 ...