系统调用返回值和错误

Ram*_*Ram 3 c linux operating-system system-calls systems-programming

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

recvfrom
sendto
sendmsg
Run Code Online (Sandbox Code Playgroud)

从上面提到的每个系统调用我检查它是否完成没有任何中断,如果它被中断,我重试.

例如:

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;
    }
Run Code Online (Sandbox Code Playgroud)

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

recvfrom()手册页说:

成功完成后,recvfrom()以字节为单位返回消息的长度.如果没有可接收的消息且对等体已执行有序关闭,则recvfrom()返回0.否则该函数返回-1并设置errno以指示错误.

与sendto和sendmsg相同的情况.

我现在无法真正检查这个,因为我无法访问服务器 - 客户端设置.任何的想法?

谢谢

nne*_*neo 7

recvfrom返回-1如果它被中断(并且设置errnoEINTR).因此,您应该检查len:

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

  • 如果函数返回指示错误的值,则只能信任`errno`.否则,它可能毫无意义. (9认同)