C read():无效参数
我试图在运行良好的C read():无效参数,c,io,C,Io,我试图在运行良好的open()返回的文件描述符上使用read()读取二进制文件,但使用errno返回22不起作用 代码如下: int input = open(argv[1], O_RDONLY|O_DIRECT); char buffer_header[4]; if(read(input,buffer_header,4) > 0) image_width = bytesToInt(buffer_header); printf("%d\n",errno); 发生的情况是read(
open()
返回的文件描述符上使用read()
读取二进制文件,但使用errno
返回22
不起作用
代码如下:
int input = open(argv[1], O_RDONLY|O_DIRECT);
char buffer_header[4];
if(read(input,buffer_header,4) > 0)
image_width = bytesToInt(buffer_header);
printf("%d\n",errno);
发生的情况是
read()
上的条件不匹配。我做错什么了吗?返回的文件描述符是3
如果read
返回-1
,则只应检查errno
,以指示它有错误
int n;
if ((n = read(input, buffer_header, 4)) > 0) {
image_width = bytesToInt(buffer_header);
} else if (n == -1) {
perror("read");
} else {
printf("EOF\n");
}
只有当
read
返回-1
时,才应选中errno
,以指示它有错误
int n;
if ((n = read(input, buffer_header, 4)) > 0) {
image_width = bytesToInt(buffer_header);
} else if (n == -1) {
perror("read");
} else {
printf("EOF\n");
}
我认为这可能与if语句大于0有关 以下是
read
手册页上的内容(在终端中键入man 2 read):
返回值
成功时,返回读取的字节数(零表示文件结束),文件位置按此数字前进。如果
此数字小于请求的字节数;例如,这可能是因为现在实际可用的字节更少(可能是因为
我们快到文件末尾了,或者因为我们正在从管道或终端读取),或者因为read()被信号中断错误时,-1为
返回,并正确设置了errno。在这种情况下,未指定文件位置(如果有)是否更改
所以你的代码应该是这样的
if(-1 == read(input,buffer_header,4)) {
perror("error with read");
} else {
do something;
}
编辑:抱歉,刚刚看到评论谢谢Barmar!!
Edit2:同样,您应该错误地检查open
syscall
int input = open(argv[1], O_RDONLY|O_DIRECT);
if(-1 == input) {
perror("error with open");
} else {
do stuff;
}
一个简短的教程可能会有所帮助我认为它可能与if语句>0有关 以下是
read
手册页上的内容(在终端中键入man 2 read):
返回值
成功时,返回读取的字节数(零表示文件结束),文件位置按此数字前进。如果
此数字小于请求的字节数;例如,这可能是因为现在实际可用的字节更少(可能是因为
我们快到文件末尾了,或者因为我们正在从管道或终端读取),或者因为read()被信号中断错误时,-1为
返回,并正确设置了errno。在这种情况下,未指定文件位置(如果有)是否更改
所以你的代码应该是这样的
if(-1 == read(input,buffer_header,4)) {
perror("error with read");
} else {
do something;
}
编辑:抱歉,刚刚看到评论谢谢Barmar!!
Edit2:同样,您应该错误地检查open
syscall
int input = open(argv[1], O_RDONLY|O_DIRECT);
if(-1 == input) {
perror("error with open");
} else {
do stuff;
}
只有在出现错误时,可能有帮助的简短教程才有效。您没有收到错误。
read()
返回-1,如果在if
结构中添加printf()
,则不会打印任何内容。errno
仅在出现错误时才有效。您没有收到错误。read()
返回-1,如果在if
结构中添加printf()
,则不会打印任何内容。唯一可能的解释是input
不是有效的描述符。我如何检查它是否无效?当前input
是3
。可能问题在于您使用的是O_DIRECT选项。根据O_DIRECT
,可能对缓冲区有对齐限制。因此,可能是buffer\u头
没有正确对齐。如果不使用O_DIRECT
,它是否有效?唯一可能的解释是input
不是有效的描述符。我如何检查它是否无效?当前input
是3
。可能问题在于您使用的是O_DIRECT选项。根据O_DIRECT
,可能对缓冲区有对齐限制。因此,可能是buffer\u头
没有正确对齐。如果您不使用O_DIRECT
,它会工作吗?当它返回-1
时,您为什么要做什么?哎呀!翻转它们。open()
似乎工作正常,读取错误
返回。您是否尝试过Barmar所说的删除O_DIRECT
?看起来你的系统调用是正确的。。。我能给出的另一个建议是使用BUFSIZ
而不是4
和sizeof(buffer\u header)
当它返回-1
时,你为什么要做什么?哎哟!翻转它们。open()
似乎工作正常,读取错误
返回。您是否尝试过Barmar所说的删除O_DIRECT
?看起来你的系统调用是正确的。。。我可以给出的另一个建议是使用BUFSIZ
而不是4
和sizeof(buffer\u header)