【发布时间】:2010-08-31 06:09:41
【问题描述】:
我正在尝试使用 C 语言进行 unix 套接字编程。但在阅读时,我得到的 Err No 为 4。我无法找到此错误代码的描述。有人知道吗?
【问题讨论】:
我正在尝试使用 C 语言进行 unix 套接字编程。但在阅读时,我得到的 Err No 为 4。我无法找到此错误代码的描述。有人知道吗?
【问题讨论】:
如果您从查看 Unix 错误代码名称 (/usr/include/errno.h) 的最终来源开始,您将看到包含错误代码的文件
#define EINTR 4 /* Interrupted system call */
(作为练习,这个文件是留给你找出来的;))
【讨论】:
errno 值对于不同的系统(甚至是不同的类 Unix 系统)可能不同,因此应在代码中使用符号常量。
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
【讨论】:
如果您收到EINTR,这可能意味着您安装了不正确的信号处理程序。当您简单地调用 signal 时,好的 unice 将默认使用可重启的系统调用,但为了安全起见,您应该使用 bsd_signal 函数(如果可用),或者使用可重启标志调用 sigaction 以避免 EINTR 的头痛.
【讨论】: