⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 process.c

📁 sip代理服务器源码
💻 C
字号:
/***********************************************************************\	SIP Server		Date		Ver		Author		MemoRandom	Jul 3,2002	1.0		Hiroaki Hata	Created	(C) 2002 All Copyrights reserved. *************************************************************************/#include <sys/types.h>#include <stdio.h>#include <sys/types.h>#include <string.h>#include <time.h>#include <unistd.h>#include <stdlib.h>#include <signal.h>#include <wait.h>#include "udp.h"#include "sipd.h"#define	DEBUG if(debug==1){#define DBG#define	PROCESS_MAX	256#define	VOID_ST		0#define	WAIT_ST		1#define	PROCEED_ST	2#define TIMEOUT_ST	3#define KILLED_ST	4#define	GUARD_TIME	PROCESS_TIME_OUTtypedef struct process_t {	int	status;	pid_t	pid;	int	fd;	char	username[CLEN];	unsigned char hash[HASH_LEN];	time_t	timeout;	time_t	lifetime;}PROCESS_TABLE;static PROCESS_TABLE	process[PROCESS_MAX];static void sig_cld(int pint){	pid_t pid;	int status;	int i;	signal(SIGCLD,sig_cld);	pid = wait(&status);	if(pid>0){		for(i=0;i<PROCESS_MAX;i++){			if(process[i].pid==pid){				process[i].status=VOID_ST;				break;			}		}	}	return;}void InitProcess(void){	int i;	for(i=0;i<PROCESS_MAX;i++){		process[i].status=VOID_ST;	}	signal(SIGCLD,sig_cld);}int RegisterProcess(pid_t pid, int fd,char *to,unsigned char *hash){	time_t	t;	int	i;	time(&t);	for(i=0;i<PROCESS_MAX;i++){		if(process[i].status==VOID_ST){			process[i].status=WAIT_ST;			process[i].pid=pid;			process[i].fd=fd;			strcpy(process[i].username,to);			memcpy(process[i].hash,hash,HASH_LEN);			process[i].timeout=t+PROCESS_TIME_OUT;			process[i].lifetime=t+PROCESS_TIME_OUT+GUARD_TIME;			return OK;		}	}	return  NG;}void CheckProcess(void){	int	i;	time_t	t;	pid_t	p;	time(&t);	for(i=0;i<PROCESS_MAX;i++){		switch(process[i].status){		case VOID_ST:			break;		case WAIT_ST:			if(process[i].timeout<t){				write(process[i].fd,"TIME_OUT",8);				close(process[i].fd);				process[i].status=TIMEOUT_ST;			}			break;		case TIMEOUT_ST:			if(process[i].lifetime<t){				kill(process[i].pid,SIGTERM);				process[i].status=KILLED_ST;			}			break;		case KILLED_ST:			if(process[i].lifetime+GUARD_TIME<t){				p=waitpid(process[i].pid,NULL,WNOHANG);				if(p==-1){					logging(2,"process not found");					process[i].status=VOID_ST;				}else{					kill(process[i].pid,SIGKILL);				}			}			break;		}	}	signal(SIGCLD,sig_cld);}int SendCoProcess(CONTAINER *buffer, char *to,unsigned char *hash){	int ret=NG;	int i;	for(i=0;i<PROCESS_MAX;i++){		if(process[i].status==WAIT_ST &&				strcmp(to,process[i].username)==0 &&				memcmp(hash,process[i].hash,HASH_LEN) ==0){			if(write(process[i].fd,buffer,sizeof(CONTAINER)) < 0 ){				ret=NG;			}else{				ret=OK;			}			close(process[i].fd);			process[i].status=PROCEED_ST;			break;		}	}	return  ret;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -