- 论坛徽章:
- 0
|
非常好的代码,但是有个小问题会导致僵尸进程,将main函数修改一下就不会了
int main(int argc, char **argv)
{
struct sockaddr_in addr;
int sock_fd, addrlen;
/* 禄帽脤貌梅脦媒IP 隆垄露丝凇垄录脿脢隆垄脥页赂霉隆垄目录麓忙位脰碌脠*/
if (!host) {
addrlen = strlen(DEFAULTIP);
AllocateMemory(&host, addrlen, DEFAULTIP);
}
if (!port) {
addrlen = strlen(DEFAULTPORT);
AllocateMemory(&port, addrlen, DEFAULTPORT);
}
if (!back) {
addrlen = strlen(DEFAULTBACK);
AllocateMemory(&back, addrlen, DEFAULTBACK);
}
if (!dirroot) {
addrlen = strlen(DEFAULTDIR);
AllocateMemory(&dirroot, addrlen, DEFAULTDIR);
}
if (!logdir) {
addrlen = strlen(DEFAULTLOG);
AllocateMemory(&logdir, addrlen, DEFAULTLOG);
}
printf
host, port, back, dirroot, logdir, daemon_y_n?"":"NO", getpid());
/* fork() }麓未娄脫潞贸陇脳模式脧 */
if (daemon_y_n) {
if (fork())
exit(0);
if (fork())
exit(0);
close(0), close(1), close(2);
logfp = fopen(logdir, "a+");
if (!logfp)
exit(0);
}
/* 麓娄脌脳陆酶鲁枚芒脡陆漏尸陆酶/
/*signal(SIGCHLD, SIG_IGN);*/
/* 麓麓陆篓 socket */
if ((sock_fd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
if (!daemon_y_n) {
prterrmsg("socket()");
} else {
wrterrmsg("socket()");
}
}
/* 脡脰露丝诳矛脰脫 */
addrlen = 1;
setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &addrlen,
sizeof(addrlen));
addr.sin_family = AF_INET;
addr.sin_port = htons(atoi(port));
addr.sin_addr.s_addr = inet_addr(host);
addrlen = sizeof(struct sockaddr_in);
/* 掳妯得樎仿÷⒙端口得埫吢?*/
if (bind(sock_fd, (struct sockaddr *) &addr, addrlen) < 0) {
if (!daemon_y_n) {
prterrmsg("bind()");
} else {
wrterrmsg("bind()");
}
}
/* 驴陋脝脕脤 */
if (listen(sock_fd, atoi(back)) < 0) {
if (!daemon_y_n) {
prterrmsg("listen()");
} else {
wrterrmsg("listen()");
}
}
while (1) {
int len;
int new_fd;
int pid;
addrlen = sizeof(struct sockaddr_in);
/* 陆脫脺脗卢陆脫毛 */
new_fd = accept(sock_fd, (struct sockaddr *) &addr, &addrlen);
if (new_fd < 0) {
if (!daemon_y_n) {
prterrmsg("accept()");
} else {
wrterrmsg("accept()");
}
break;
}
bzero(buffer, MAXBUF + 1);
sprintf(buffer, "Peer: %s:%d\n",
inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
if (!daemon_y_n) {
prtinfomsg(buffer);
} else {
wrtinfomsg(buffer);
}
/* 虏煤赂枚酶麓娄脌脟脟拢卢碌卤前陆酶脨碌却媒卢陆拥陆4 */
if((pid=fork())<0){
printf("fork error");
} else if(pid==0){
/* first child*/
if((pid = fork())<0)
printf("fork error");
else if(pid >0)
exit(0);
bzero(buffer, MAXBUF + 1);
if ((len = recv(new_fd, buffer, MAXBUF, 0)) > 0) {
FILE *ClientFP = fdopen(new_fd, "w");
if (ClientFP == NULL) {
if (!daemon_y_n) {
prterrmsg("fdopen()");
} else {
prterrmsg("fdopen()");
}
} else {
char Req[MAXPATH + 1] = "";
sscanf(buffer, "GET %s HTTP", Req);
bzero(buffer, MAXBUF + 1);
sprintf(buffer, "Request File: \"%s\"\n", Req);
if (!daemon_y_n) {
prtinfomsg(buffer);
} else {
wrtinfomsg(buffer);
}
/* 麓娄脌脫禄搂脟脟 */
GiveResponse(ClientFP, Req);
fclose(ClientFP);
}
}
exit(0);
}
if(waitpid(pid,NULL,0)!=pid)
printf("waitpid error");
close(new_fd);
}
close(sock_fd);
return 0;
} |
|