unistd.h 中的 read() 函数不读取任何字节[重复]

问题描述 投票:0回答:1

我正在尝试使用Linux系统编程做一些低级文件处理。 我正在尝试打开一个文件:使用 open(),使用 write() 向文件写入内容,并使用 read() 读取文件的内容。

我的代码如下:

int32_t fd;
int32_t bytes;

fd = open(fileName, O_RDWR | O_NOCTTY | O_NDELAY);
retVal = write(fd, writeBuffer, sizeof(writeBuffer));
//The write buffer is a character array of size 20 initialized to "abc123abc123abc123\r"
bytes = read(fd, readBuffer, sizeof(writeBuffer));
//The read buffer is a character array of size 20 initialized to "xxxxxxxxxxxxxxxxxxx\r"

我的代码没有错误,但没有读取任何字节。 执行结束时,bytes = 0,readBuffer 仍为“xxxxxxxxxxxxxxxxxx” ”

我哪里出错了?

我尝试了上面的代码

c linux-device-driver systems-programming fcntl unistd.h
1个回答
0
投票

普通的 Unix 文件描述符默认是为顺序读写而设计的。每个文件描述符都包含一个“当前位置”,该位置由每个

read
write
操作更新。您的
write
操作写入
sizeof writeBuffer
字节,并将当前位置前进那么多字节。然后您的
read
操作尝试从该高级位置读取。由于文件中的该位置还没有数据,因此
read
不会读取任何字节。

要读取之前写入的数据,必须调整文件描述符中的当前位置,可以使用

lseek
:

来实现
off_t offset = lseek(fd, - (off_t) sizeof writeBuffer, SEEK_CUR);
if (offset == -1)
{
    fprintf(stderr, "Error, lseek failed.\n");
    exit(EXIT_FAILURE);
}

请注意,在对其求反之前,必须将

sizeof writeBuffer
转换为
off_t
等有符号类型。
sizeof
产生无符号类型,因此直接应用
-
运算符是没有用的。

或者,您可以打开文件两次,并使用一个文件描述符进行写入,另一个进行读取。那么这两个描述符将具有不同的当前位置,您可以顺序写入一个描述符并分别顺序读取另一个。这可能会引入缓冲问题,本答案中未进一步讨论。

© www.soinside.com 2019 - 2024. All rights reserved.