- 论坛徽章:
- 0
|
守护进程自己停掉的问题
这样写吧,这个模版应该不会出现你说的问题
volatile keep_going = 1; /* controls program termination */
/* Function prototypes: */
void termination_handler (int signum); /* clean up before termination */
int main (void)
{
int listenfd,clifd,i;
char HOME_DIR[30];
long pid;
struct sockaddr_in myaddr,cliaddr;
int ret;
int len;
strcpy(HOME_DIR,"/disk3/teach/html/support/server" ;
if (chdir (HOME_DIR)) /* change to directory containing data */
{
fprintf (stderr, "`%s': ", HOME_DIR);
perror (NULL);
exit (1);
}
/* Become a daemon: */
switch (fork ())
{
case -1: // can't fork
perror ("fork()" ;
exit (3);
case 0: // child, process becomes a daemon:
close (STDIN_FILENO);
close (STDOUT_FILENO);
close (STDERR_FILENO);
if (setsid () = -1) // request a new session (job control)
{
exit (4);
}
break;
default: // parent returns to calling process:
return 0;
}
/* Establish signal handler to clean up before termination: */
if (signal (SIGTERM, termination_handler) = SIG_IGN)
signal (SIGTERM, SIG_IGN);
signal (SIGINT, SIG_IGN);
signal (SIGHUP, SIG_IGN);
listenfd=socket(AF_INET,SOCK_STREAM,0);
if (listenfd<0)
{
perror("socket error" ;
exit(-1);
}
myaddr.sin_family=AF_INET;
myaddr.sin_addr.s_addr=htonl(INADDR_ANY);
myaddr.sin_port=htons(8895); //port
ret=bind(listenfd,(struct sockaddr *)&myaddr,sizeof(myaddr));
if (ret<0)
{
perror("bind error" ;
exit(-1);
}
listen(listenfd,10);
len=sizeof(struct sockaddr);
while(1)
{
clifd=accept(listenfd,(struct sockaddr*)&cliaddr,&len);
if(clifd=-1)
{
perror("accept error" ;
continue;
}
switch(pid=fork())
{
case 0:
close(listenfd);
读写!
exit(0);
break;
case -1:
perror("fork error" ;
break;
default:
close(clifd);
break;
}
}
close(listenfd);
close(clifd);
return 0;
}
void termination_handler (int signum)
{
keep_going = 0;
signal (signum, termination_handler);
} |
|