我怎样才能得到一个读取操作的错误c

下面的代码返回-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 errnoman 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 。 在这种情况下,没有指定文件位置(如果有的话)是否改变。

(我的重点)

所以你可以使用errnostrerror来描述错误的字符串。

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打印错误消息和自定义字符串。