- 论坛徽章:
- 0
|
一段关于网络SOCKET编程,环境是fedora linux.
有关代码
for(; {
child_len = sizeof(child_socket);
connfd = accept(listenfd, (struct sockaddr *)&child_socket, &child_len);//标记
if((child_pid = fork()) == 0) {
printf("my pid is:%d\n", getpid());
close(listenfd);
str_echo(connfd);
close(connfd);
exit(0);
}
close(connfd);
}
void install() {
struct sigaction act, old_act;
sigemptyset(&act.sa_mask);
act.sa_flags = SA_SIGINFO;
act.sa_sigaction = my_op;
if(sigaction(SIGCHLD, &act, &old_act) < 0) {
printf("install signal failed\n" ;
exit(1);
}
}
void my_op(int signum, siginfo_t * info, void * myact) {
pid_t pid;
int stat;
pid = wait(&stat);
printf("%d process terminated\n", pid);
return;
}
代码有点长了,但我想应该都是属于相关代码。主进程在标记处挂起,当外部链接以后。主进程从accept返回,创建子进程处理完请求,主进程继续执行到accept挂起,子进程在完成操作后终结,向父进程发送sigchld信号后,会被我的my_op函数处理。处理完后,主进程从accept返回(此时没有外部链接)。查阅完部分资料后,我找到的答案是:信号sigchld会导致被accept阻塞的父进程继续执行,而执行完我指定的函数my_op后,父进程从accept处返回,但返回一个错误eintr,父进程忽略错误,继续向下执行。不知道我这样理解对不对,然后书上的说法比较笼统,希望有人能够给出比较完整的说法。
PS:当我不自己处理SIGCHLD信号时候,子进程依然会向父进程发送这个信号,虽然父进程如何处理我不太清楚,但此时父进程依然是在accept处被阻塞,按照上面的说法,此时父进程也应该会从accept处错误返回,但为什么当我从代码中拿去install捕获信号的代码后,父进程在子进程发送sigchld后,依然在accept处被阻塞。
先道个谢 |
|