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)