当前位置: 技术问答>linux和unix
Socket编程的问题
来源: 互联网 发布时间:2016-08-09
本文导语: if (listen(sockfd, BACKLOG) == -1) { perror("listen"); exit(1); } sa.sa_handler = sigchld_handler; // reap all dead processes sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; if (sigaction(SIGCHLD, &sa, NU...
if (listen(sockfd, BACKLOG) == -1) {
perror("listen");
exit(1);
}
sa.sa_handler = sigchld_handler; // reap all dead processes
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
if (sigaction(SIGCHLD, &sa, NULL) == -1) {
perror("sigaction");
exit(1);
}
printf("server: waiting for connections...n");
while(1) { // main accept() loop
sin_size = sizeof their_addr;
new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
if (new_fd == -1) {
perror("accept");
continue;
}
inet_ntop(their_addr.ss_family,
get_in_addr((struct sockaddr *)&their_addr),
s, sizeof s);
printf("server: got connection from %sn", s);
if (!fork()) { // this is the child process
close(sockfd); // child doesn't need the listener
if (send(new_fd, "Hello, world!", 13, 0) == -1)
perror("send");
close(new_fd);
exit(0);
}
close(new_fd); // parent doesn't need this
}
return 0;
中的代码
sa.sa_handler = sigchld_handler; // reap all dead processes这是做什么用的,原理是什么啊。我查了怎么会是信号处理函数呢
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
if (sigaction(SIGCHLD, &sa, NULL) == -1) {
perror("sigaction");
exit(1);
}
|
我也是刚学,这是我的理解:
sigaction为这个进程注册一个信号处理函数(为sigchld_handler),当这个进程接收到SIGCHLD这个信号时,处理函数被调用以处理这个函数。
至于SIGCHLD信号。当进程的子进程结束时,进程就会收到子进程发来的SIGCHLD信号。这样进程可以在这个时候进行相关操作。由于在linux里面,进程结束后,还会保存一些相关的进程信息,直至父进程处理其SIGCHLD,所以为了资源效率问题最好要处理这个信号。
sigaction为这个进程注册一个信号处理函数(为sigchld_handler),当这个进程接收到SIGCHLD这个信号时,处理函数被调用以处理这个函数。
至于SIGCHLD信号。当进程的子进程结束时,进程就会收到子进程发来的SIGCHLD信号。这样进程可以在这个时候进行相关操作。由于在linux里面,进程结束后,还会保存一些相关的进程信息,直至父进程处理其SIGCHLD,所以为了资源效率问题最好要处理这个信号。