📄 process.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 + -