当我发送很多kill()命令时,我的服务器不处理所有信号

rap*_*777 3 c linux signals kill system-calls

这个小代码我有问题.我有一个"服务器"和一个"客户端".服务器等待SIGUSR1客户端.但是当我发送SIGUSR1循环时,服务器不处理每个信号!我i++每次收到信号时都会这样做,而当我发送1000个信号时,我得到981.

usleep()sleep()没有帮助.

这是客户端代码:

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

int     main(int ac, char **av)
{
  int   i = 0;
  int status = 0;

  if (ac < 2)
    return (0);
  printf("kill %s (%d)", av[1], atoi(av[1]));
  for (i=0;i<=1000;i++)
    {
      printf("%d\n", i);
      kill(atoi(av[1]), SIGUSR1);
    }
  kill(atoi(av[1]), SIGUSR2);
}
Run Code Online (Sandbox Code Playgroud)

和服务器代码:

#include <signal.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int i = 0;

void    sig2(int signum)
{
  /* usleep(30); */
  printf("%d\n", i);
  i = 0;
}

void my_handler(int signum)
{
  i++;
}

int     main()
{
  printf("pid: %d\n", getpid());
  if (signal(SIGUSR1, my_handler) == SIG_ERR)
    {
      printf("rt\n");
      exit(0);
    }
  signal(SIGUSR2, sig2);
  while (1);
}
Run Code Online (Sandbox Code Playgroud)

pil*_*row 5

你错过了一些彼此"顶部"到达的信号,对于应用程序来说太快了.

标准说:

如果生成后续出现的未决信号,则在实现中定义信号是否在需要排队的情况以外的情况下被多次传送或接受.

...这是一种有点模糊的方式,说普通的UNIX信号不需要排队.在大多数实现中,它们没有.例如,如果在处理它们之前生成了五个SIGFOO信号,则只有一个将保持未决状态,因此应用程序将仅接收一个.