我正在编写一个赋值,其中一个进程(发送方)应该使用消息队列将消息发送到另一个进程(接收方)。该赋值规定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中的信号处理程序?