发送到消息队列后将SIGIO信号发送到另一个进程(C)

时间:2014-11-10 22:58:51

标签: c signals message-queue

我正在编写一个赋值,其中一个进程(发送方)应该使用消息队列将消息发送到另一个进程(接收方)。该赋值规定Receiver不应阻塞或轮询队列,而是在向队列发送消息后Sender应该向接收者发送SIGIO。

我的问题是我不知道该怎么做。我确定问题不在于队列,而是在Receiver端的信号处理程序或在发送方端发送SIGIO。

这是发件人的代码,在计时器上调用:

/*code for sending a message, works as intended*/
/*code below is questionable*/
//msqid is the message queue id; I'm guessing that's the file descriptor I want.
fcntl(msqid, F_SETOWN, receiver_pid); //designates receiver as the process to send the signal too?
int flags;
flags = fcntl(msqid, F_GETFL); //save flags
fcntl(msqid, F_SETFL, flags | O_ASYNC); //set flag that sends SIGIO?

这是在接收器的主要功能中设置的信号处理程序(格式是从一个有效的报警处理程序复制的,所以我认为这是正确的):

struct sigaction act;
memset(&act, 0, sizeof(act)); //clear it
act.sa_handler = &packet_handler;
if (sigaction(SIGIO, &act, NULL) == -1)
{
perror("Error setting up SIGIO handler");
}

最后接收器在等待消息时调用pause()。

  while (pkt_cnt < pkt_total) {
  pause(); /* block until next packet */
  }

运行此代码时的结果是所有消息都放在队列中,但接收器中的信号处理程序永远不会触发。

如何根据发件人的操作触发Receiver中的信号处理程序?

0 个答案:

没有答案