免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1573 | 回复: 2
打印 上一主题 下一主题

关于被阻塞进程信号问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-26 11:40 |只看该作者 |倒序浏览
一段关于网络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处被阻塞。

先道个谢

论坛徽章:
0
2 [报告]
发表于 2010-03-26 22:11 |只看该作者
有些系统的慢速系统调用被信号打断后会自动重启,但这是不可移植的

论坛徽章:
0
3 [报告]
发表于 2010-03-29 11:52 |只看该作者
谢谢楼上的回答。查了下,某些慢系统调用被信号打断后“可能”会被重启。这里应该是accept被sigchld打断后没有重启,所以错误返回。
谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP