gpt4 book ai didi

C - 使 msgrcv 与信号共存

转载 作者:行者123 更新时间:2023-11-30 15:02:26 26 4
gpt4 key购买 nike

我需要一些关于 msgrcv 的帮助...我需要能够接收这样的消息:

while(1){
int status = msgrcv(qid, &msg, sizeof(msg.data), user_id,0 )
if(status < 0) { perror("something wrong..."); exit(1); }
}

还有代码中的某个地方:

void stuff_to_do(int signal){
// ....
}
//...
signal(SIGQUIT, stuff_to_do);

但是我收到一个中断的系统调用,可能是因为信号杀死了 msgrcv 或类似的东西。我该如何解决这个问题?我应该 fork() 并在一个进程中执行 msgrcv 并在另一个进程中执行这些操作吗?或者,还有更好的方法?感谢您的帮助!

最佳答案

是的,如果您的进程在 msgrcv() 期间收到信号,它将被中断。

来自man pages on msgrcv() :

The calling process catches a signal. In this case the system call fails with errno set to EINTR. (msgrcv() is never automatically restarted after being interrupted by a signal handler, regardless of the setting of the SA_RESTART flag when establishing a signal handler.)

尝试识别此故障情况,然后使用类似的内容重新启动 msgrcv()

while (1) {
// Try to receive message
errno = 0;
int status = msgrcv(qid, &msg, sizeof(msg.data), user_id,0 )

if (status < 0) {
if (errno == EINTR) continue; // try again

// Something else went wrong
perror("something wrong...");
exit(1);
}
}

不要忘记,您必须在要测试的操作之前手动设置 errno = 0

这让我想起了good answer它描述了并发性和同时性。它解释了为什么您必须始终使用尝试操作,然后检查是否成功的方法。

<小时/>

另请参阅:

关于C - 使 msgrcv 与信号共存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41071650/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com