- 论坛徽章:
- 0
|
StackOverflow上有哥们给了个解答,说accept会被SIGCHLD中断,下面是他给出的代码
- #!/usr/bin/perl
- use strict;
- use warnings;
- use Socket;
- use POSIX qw(:sys_wait_h);
- sub REAPER {
- local $!; # Don't let signal handler mess with $!
- 1 until -1 == waitpid(-1, WNOHANG);
- $SIG{CHLD} = \&REAPER;
- }
- $SIG{CHLD} = \&REAPER;
- socket(SERVER, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
- setsockopt(SERVER, SOL_SOCKET, SO_REUSEADDR, 1);
- my $my_addr = sockaddr_in(8080, INADDR_ANY);
- bind SERVER, $my_addr;
- listen(SERVER, 1000);
- REQUEST:
- while (1) {
- my $paddr = accept(CLIENT, SERVER) || do {
- # try again if accept() returned because a signal was received
- next REQUEST if $!{EINTR};
- die "accept: $!";
- };
- my $pid;
- if ($pid = fork) {
- close CLIENT;
- next REQUEST;
- }
- die "$!" unless defined $pid;
- close SERVER;
- print CLIENT "hello\n";
- close CLIENT;
- exit;
- }
复制代码 |
|