-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.c
95 lines (71 loc) · 2.21 KB
/
main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include "unp.h"
#include "functions_from_book.h"
#include "myfunctions.h"
int main(int argc, char **argv)
{
int listenfd, i;
FILE *fp;
pid_t selfpid; /* 父进程用来存放自己的pid */
const int on = 1;
int login_fd[2]; /* 用来记录登录状态的管道 */
struct sockaddr_in servaddr;
daemon(1, 1); /* 变为守护进程 */
if(pipe(login_fd) == 0)
Write(login_fd[1], "0", 1); /* 初始向管道中写入0,表示用户未登录 */
else {
perror("pipe failed");
return -1;
}
listenfd = Socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
/* Inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr); */
servaddr.sin_port = htons(CLIENT_PORT);
Setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
Bind(listenfd, (SA *)&servaddr, sizeof(servaddr));
Listen(listenfd, LISTENQ);
pids = Calloc( NCHILDREN, sizeof(pid_t));
fp = fopen("./config/parentPid", "w");
selfpid = getpid();
fprintf(fp , "%d", selfpid ); /* 将父进程的pid保存起来 */
fclose(fp);
my_lock_init();
for (i = 0; i < NCHILDREN; i++)
pids[i] = child_make(listenfd, login_fd); /* parent returns */
Signal(SIGTERM, sig_term);
for ( ; ; )
pause(); /* everything done by children */
return 0;
}
pid_t child_make(int listenfd, int *login_fd)
{
pid_t pid;
int connfd;
socklen_t clilen;
struct sockaddr_in cliaddr;
if ( (pid = Fork()) > 0)
return(pid); /* parent */
/* child execute,never returns */
printf("child %ld starting\n", (long) getpid());
for ( ; ; ) {
clilen = sizeof(cliaddr);
my_lock_wait();
connfd = Accept(listenfd, (SA *)&cliaddr, &clilen);
printf("\nchild %ld accepted!\n", (long)getpid());
my_lock_release();
printf("\nchild %ld release!\n", (long)getpid());
do_Proxy(connfd, login_fd); /* process the request */
Close(connfd);
}
printf("child %ld exit!\n", (long) getpid());
}
/* 信号处理函数 */
void sig_term(int signo)
{
int i;
for(i=0; i < NCHILDREN; i++)
kill(pids[i],SIGTERM);
while( wait(NULL) > 0);
exit(0);
}