【问题标题】:handling sigusr1 and sigusr2, works for only sigusr2处理 sigusr1 和 sigusr2,仅适用于 sigusr2
【发布时间】:2014-08-17 20:30:36
【问题描述】:

这(几乎)是一道作业题。我有一个发送者和一个接收者程序。 Sender 将接收者的 pid 和 int t 作为命令行参数。它有一个由 As 和 Bs 组成的字符串(例如“AABBBA”),并通过信号将该字符串发送给接收器。对于字符串中的每个 A 发送一个 SIGUSR1,对于每个 B 发送一个 SIGUSR2。并在每个字母之间等待 t 毫秒。

接收者,应该为每个到达的 SIGUSR1 打印一个 A,为每个到达的 SIGUSR2 打印一个 B。我不明白为什么,但我的接收器只打印 Bs。这是第一个问题。

在上面的代码中,我使用了两个信号处理程序,每个处理程序一个。但我也想知道是否可以使用单个处理程序来处理它们。我读过类似的东西,这不好。但我不确定我是否明白了。我尝试了它们,但无论如何它只打印Bs。使用这样的处理程序可以吗?:

 void handler(int signum)
 {
    if (signum == SIGUSR1) // arrived .
    {
      write(1,"A\n", 2);
    }
    else if(signum == SIGUSR2) //arrived _:
    {
      write(1,"B\n", 2);
    }
 }

 //in the main function...

 sa.sa_handler = handler_sg1;
 ec_neg1(sigaction(SIGUSR1, &sa, NULL), "sigaction");
 ec_neg1(sigaction(SIGUSR2, &sa, NULL), "sigaction");

发件人.c:

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

 #define ec_neg1(s,m) if((s) == -1) {perror(m); exit(errno);}


 int main(int argc, char *argv[])
 {
  pid_t pid;
  int sleepVal;

  struct timespec ts;

  if(argc == 3)
  {
    pid = atoi(argv[1]);
    sleepVal= atoi(argv[2]);

    ts.tv_sec = 0;
    ts.tv_nsec = sleepVal * 1000000L;

    printf("sender started...\n");

    char msg[100] = "AABBBABA";
    int i;

    for (i = 0; msg[i] != '\0'; ++i)
    {
          if(msg[i] == 'A')
              kill(pid, SIGUSR1);
          else if( msg[i] == 'B')
              kill(pid, SIGUSR2);

          //Wait for sleepVal  milliseconds after every signal
          ec_neg1(nanosleep(&ts, NULL),"nanosleep failed")
    }

    printf("done.\n");

  }

  return 0;
 } 

receiver.c:

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <errno.h>
 #include <unistd.h>
 #include <signal.h>

 #define ec_neg1(s,m) if((s) == -1) {perror(m); exit(errno);}



 static void handler_sg1(int signum)
 { 
   write(1,"A\n", 2);
 }

 static void handler_sg2(int signum)
 { 
   write(1,"B\n", 2);
 }

 int main(int argc, char *argv[])
 {

   struct sigaction sa;

   memset(&sa, 0, sizeof(sa));
   sa.sa_handler = handler_sg1;
   ec_neg1(sigaction(SIGUSR1, &sa, NULL), "sigaction");
   sa.sa_handler = handler_sg2;
   ec_neg1(sigaction(SIGUSR2, &sa, NULL), "sigaction");

   printf("receiver started...\n");

   while(1)
     ;


  return 0;
 }

【问题讨论】:

  • ec_neg1 是否立即调用它的参数?
  • @stark 我不明白你的意思。但我认为ec_neg1没有问题...

标签: c signals signal-handling


【解决方案1】:

好的。如果您只是将 sleepVal 分配给 tv_sec 并将 tv_nsec 分配给 0 工作?

【讨论】:

  • 不,它仍然只打印 Bs。为什么你认为问题出在 nanosleep 上?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 2011-09-17
  • 2021-11-06
  • 1970-01-01
  • 2021-12-25
  • 2021-12-01
  • 2013-07-09
相关资源
最近更新 更多