读取系统调用

时间:2010-08-30 16:41:42

标签: c sockets unix

我正在尝试使用C中的unix套接字编程。但是在阅读时我得到Err No为4.我无法找到此错误代码的描述。有人有任何想法吗?

3 个答案:

答案 0 :(得分:2)

如果您首先查看Unix错误代码名称的最终来源(/usr/include/errno.h),您将到达包含错误代码的文件

#define EINTR            4      /* Interrupted system call */

(这个文件留待您查找,作为练习;))

答案 1 :(得分:2)

对于不同的系统(甚至不同的类Unix系统),errno值可能不同,因此符号常量应该用在代码中。

perror函数将打印出(到 stderr )最后errno值的描述性字符串以及您提供的字符串。

man 3 perror

strerror函数只会将const char *返回到perror打印的字符串。

如果您的系统上有4 EINTR,那么您在通话期间就会收到一个信号。有一些方法可以防止中断您的系统调用,但通常只需要:

while (1) {
   ssize_t x = read(file, buf, len);
   if (x < 0) {
       if (errno == EINTR) {
           errno = 0;
           continue;
       } else {
          // it's a real error

答案 2 :(得分:0)

如果您获得EINTR,则可能意味着您已正确安装了信号处理程序。只需调用signal,好的unices将默认为可重新启动的系统调用,但为了安全起见,您应该使用bsd_signal函数(如果可用),或者使用可重启标志调用sigaction以避免令人头疼的是EINTR