gpt4 book ai didi

c - 系统调用返回值和errno

转载 作者:IT王子 更新时间:2023-10-29 00:53:57 30 4
gpt4 key购买 nike

我在我的程序中使用了以下系统调用:

recvfrom
sendto
sendmsg

并且从上面提到的每个系统调用中,我检查它是否在没有任何中断的情况下完成,如果它被中断,我会重试。

例如:

recvagain:     
len = recvfrom(fd, response, MSGSIZE, MSG_WAITALL, (struct sockaddr *)&from, &fromlen);
if (errno == EINTR) {
syslog(LOG_NOTICE, "recvfrom interrupted: %s", strerror(errno));
goto recvagain;
}

这里的问题是我是否需要在每次失败时将 errno 值重置为 0。或者如果 recvfrom() 成功,它是否将 errno 重置为 0?

recvfrom() 手册页说:

Upon successful completion, recvfrom() returns the length of the message in bytes. If no messages are available to be received and the peer has performed an orderly shutdown, recvfrom() returns 0. Otherwise the function returns -1 and sets errno to indicate the error.

与 sendto 和 sendmsg 相同。

我现在无法真正检查这个,因为我无权访问服务器-客户端设置。有什么想法吗?

谢谢

最佳答案

如果被中断,

recvfrom 返回 -1(并将 errno 设置为 EINTR)。因此,您应该只检查 len:

if(len == -1) {
if(errno == EINTR) {
syslog(LOG_NOTICE, "recvfrom interrupted");
goto recvagain;
} else {
/* some other error occurred... */
}
}

关于c - 系统调用返回值和errno,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12927216/

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