当前位置: 技术问答>linux和unix
一个信号的问题
来源: 互联网 发布时间:2016-09-09
本文导语: int main ( int argc, char *argv[] ) { int sock, fd; char buf[] = "hello world!"; sock = make_server_socket("192.168.1.101", 13000); if (sock == -1) { exit(1); } signal(SIGCHLD, child_waiter); while(1) { fd = accept(sock, NULL, NULL); printf("wow! get a ca...
int main ( int argc, char *argv[] )
{
int sock, fd;
char buf[] = "hello world!";
sock = make_server_socket("192.168.1.101", 13000);
if (sock == -1)
{
exit(1);
}
signal(SIGCHLD, child_waiter);
while(1)
{
fd = accept(sock, NULL, NULL);
printf("wow! get a calln");
if (fd == -1)
{
break;
}
process_request(fd);
close(fd);
}
return EXIT_SUCCESS;
} /* ---------- end of function main ---------- */
void process_request (int fd)
{
int pid, exitstatus;
if ( fork() == 0)
{
dup2(fd, 1);
close(fd);
execlp("date", "date", NULL);
perror("ececvp");
exit(1);
}
} /* ----- end of function process_request ----- */
void child_waiter (int signum)
{
while (waitpid(-1, NULL, 0) > 0)
;
} /* ----- end of function child_waiter ----- */
以上代码,必要的头文件和函数声明都有。
我的问题是:书上说在处理信号跳转的时候,系统会中断accept,accept会返回-1,然后主循环结束。
但我实验用:telnet 192.168.1.101 13000,输出一切正常阿,没有发现这个server程序还在运行ps下进程还在
这是为什么阿?
书上要求修改代码,让主函数有甄别是真正的错误,还是被打断的系统调用错误
这又是什么意思阿?
|
Linux平台的glibc没有调用系统调用signal,
而是使用sigaction实现的signal,
sigaction有一个参数可以指定SA_RESTART,
被SA_RESTART标志注册的信号处理函数,
即使打断某些系统调用,也能自动重启,不会返回失败,
可以试试siginterrupt函数,让系统调用允许被中断打断而不重启。
signal函数在不同平台表现不同,尽量用sigaction
而是使用sigaction实现的signal,
sigaction有一个参数可以指定SA_RESTART,
被SA_RESTART标志注册的信号处理函数,
即使打断某些系统调用,也能自动重启,不会返回失败,
可以试试siginterrupt函数,让系统调用允许被中断打断而不重启。
signal函数在不同平台表现不同,尽量用sigaction
|
书上要求修改代码,让主函数有甄别是真正的错误,还是被打断的系统调用错误
if (fd == -1)
{
break;
}
--->
if(fd==-1)
{
if(errno == EINTR)
continue;
else
break;
}
if (fd == -1)
{
break;
}
--->
if(fd==-1)
{
if(errno == EINTR)
continue;
else
break;
}
|
不懂帮顶~
|
同意