下面的代码返回-1,我怎么知道什么是错的? 得到一个详细的错误什么的?
if (read(programFile, value, sizeof(FRAME)) == -1) { return SYSTEM_CALL; }
你需要查看errno
,这是一个由系统调用设置的变量来指示错误。 您可以使用便利功能perror
来获得一个人类可读的打印输出。
if (read(prog, value, sizeo(FRAME) == -1) { perror("read"); // handle error }
它可以返回像No such file or directory
。 无论哪种方式,它是一个很好的做法,使用它。
请查看man errno
和man perror
以获取更多信息。
您可以检查全局变量errno
,如手册页中所指定,
返回值
如果成功,则返回实际读取的字节数。 在读取文件结束时,返回零。 否则,将返回-1 ,并将全局变量
errno
设置为指示错误。
例如,
ssize_t bytesRead = read(...); if (bytesRead == -1) { switch (errno) { case EINVAL: return "Invalid FD"; case EISDIR: return "FD is a directory"; ... } }
从read
手册页:
成功时返回读取的字节数(零表示文件结束),文件位置按此编号提前。 如果这个数字小于请求的字节数就不是错误; 这可能发生,例如因为现在实际上可用的字节更少(可能是因为我们接近文件结束,或者因为我们正在从管道读取或从终端读取),或者因为read()被中断信号。 出错时,返回-1,并适当地设置errno 。 在这种情况下,没有指定文件位置(如果有的话)是否改变。
(我的重点)
所以你可以使用errno
和strerror
来描述错误的字符串。
Errno
应该设置,为您检查错误是什么。 更多信息在这里
#include <error.h> #include <errno.h> if (read(programFile, value, sizeof(FRAME)) == -1) { error (0, errno, "Damn it %s", my_string); /* use nonzero as the 1st param to exit after this function */ return SYSTEM_CALL; }
你可以用errno
来使用error
函数。 这将打印错误消息和作为参数传递的自定义字符串。
其他
#include <stdio.h> if (read(programFile, value, sizeof(FRAME)) == -1) { perror ("Damn It!!"); return SYSTEM_CALL; }
使用perror
打印错误消息和自定义字符串。