玩弄信号

时间:2015-03-16 18:29:36

标签: c signals

我目前正在研究一个关于信号的项目,基本上我有一个客户端和一个服务器,服务器发出一个pid,我必须用一个字符串作为参数输入到客户端,在启动后,客户端将此字符串发送到服务器,服务器显示它。

我到目前为止所做的是将字符串转换为二进制,如果整数为0,我发送SIGUSR1(如果它是1)我发送SIGUSR2,这样我想转换二进制到我们以前的字符串,但我想知道我怎么能这样做。

这是服务器的主要部分,因为你可以看到它显示了它的pid(所以我们可以稍后用它启动客户端)并等待一个信号。一旦它捕获了一个,它就会调用my_sig(稍后会在这个帖子中找到)。

int     main()
{
  int   pid;

  pid = getpid();
  printf("Server pid is: %d\n", pid);
  if (signal(SIGUSR1, my_sig) == SIG_ERR)
    {
      printf("Error.\n");
      exit(1);
    }
  if (signal(SIGUSR2, my_sig) == SIG_ERR)
    {
      printf("Error.\n");
      exit(1);
    }
  while (1);
}

这是非常简单的my_sig,你可以看到它是否接收SIGUSR1作为信号它显示0,否则为1。

void            my_sig(int param)
{
  char          *src;
  char          *dest;

  if (param == SIGUSR1)
    {
      my_printf("0");
    }
  if (param == SIGUSR2)
    {
      my_printf("1");
    }
}

因此,在一天结束时,它所做的是通过char显示客户端中二进制char中给出的单词。

我怎么能用它来显示我在客户端输入的字符串?

谢谢你们,如果你需要任何精确,请告诉我。

编辑:尽管我很想知道其他信号,遗憾的是,我对这个项目仅限于这些。

2 个答案:

答案 0 :(得分:0)

使用信号传输二进制数据既缓慢又低效。 如果您仍然坚持这样做,则必须将这些位打包成字节 而不是打印“1”或“0”

这是你可能采取的一种方式。

#define MAX_BYTES 64
static int current_bit=0,current_byte=0;
static char byte=0,output_bytes[MAX_BYTES];
void            my_sig(int param){
  char          *src;
  char          *dest;

  if (param == SIGUSR1)
    {
      byte &= ~(128 >> current_bit);
    }
  if (param == SIGUSR2)
    {
      byte |= (128 >> current_bit);
    }
    current_bit++;
    if(current_bit > 7){
        current_bit = 0;
        output_byte[current_byte] = byte;
        byte = 0;
        if(current_byte < (MAX_BYTES-1)){
            current_byte++;
        }

    }
}

这是糟糕的代码。但无论如何,发送信号数据的想法并不好。

输出将在output_byte数组中。

答案 1 :(得分:0)

信号在很大程度上不适合此任务,因为根据时间安排可能会丢失信息。

标准信号将丢失位和排序。这些信号被单独命名(例如,SIGUSR1,SIGUSR2),并且不排队。因此,只有标准信号的实例可以在任何时候待决。此外,他们的交付顺序无法保证,但实际上通常是从最低到最高。因此,如果我发送你的进程USR2,USR2,USR1,USR1,USR2,USR2并获得正确的时间,它可能会收到一个USR1,然后是一个USR2。

实时信号将失去您的订购。这些信号在SIGRTMIN到SIGRTMAX范围内编号,执行队列,并具有已定义的传送顺序。不幸的是,该顺序为lowest to highest,因此存在与上述类似的问题。 (你接收MIN + 0,MIN + 0,MIN + 1,MIN + 1,MIN + 1,MIN + 1。)

(如果您使用sigaction而不是signal,并且如果您在信号处理程序注册中指定了SA_SIGINFO,并且信令应用程序使用sigqueue发送了一个int和一个选定的通过sival_int实时信号,然后你可以通过信号顺序传输1和0。然而,这是一个折磨的用例。)