【问题标题】:Does a fd pointer get incremented when I use it to read() or write() AND how can the incrementation be controlled?当我将 fd 指针用于 read() 或 write() 时,fd 指针是否会增加?如何控制增量?
【发布时间】:2020-04-23 18:05:36
【问题描述】:

我正在尝试从文件中读取一行并返回指向下一行开头的指针,但我不明白当我使用 fd 一次读取 10 个字符时发生了什么。我只能使用 read、write、open 和 malloc。

示例file.txt(明确显示\n):

Sphinx of black quartz, judge my vow.\n
Pack my box with five dozen liquor jugs.\n
The quick brown fox jumps over the lazy dog.\n

main.c

int fd = open("file.txt", O_RDONLY);
int fd2 = open("oneline.txt", O_CREAT | O_WRONLY);
char *buffer = (char *)malloc(sizeof(char) * 10);

read(fd, buffer, 10);
write(fd2, &buffer, 10);

1) fd 现在会指向file.txtfd2oneline.txt 的EOF 的第11 个字符吗?


继续main.c示例:

int newline = 0, found = 0;
while(found == 0)
{
    read(fd, buffer, 10);
    for(int i = 0; buffer[i] != '\n' || i < 10; i++)
    {
        newline++;
        if(buffer[i] == '\n')
            found = 1;
    }
}

如果fd 指向file.txt 中的第41 个字符(while 循环运行了4 次,'\n' 是第38 个字符)。整数 newline 的值等于 38。

2) 如何让 fd 指向 '\n' 字符之后的第 39 个字符?

【问题讨论】:

  • 仅供参考,read(fd, &amp;buffer, 10); 是错误的。那应该是 read(fd, buffer, 10); 。您的代码在指针本身而不是它指向的内存上爆炸,从而失去了前一个代码行(malloc)对以太的分配(从而导致内存泄漏),同时调用 未定义的行为 如果实际读取的数据量大于指针的大小。 write(fd2, &amp;buffer, 10); 的类似问题,但顺序相反。
  • fd 不会改变。 fd 是文件描述符数组的索引。该数组由操作系统保存。每个文件描述符都包含有关文件的所有信息(当文件打开时)。每个文件描述符都是一个struct。一般来说,你永远不需要知道文件描述符结构内容的细节。
  • 关于:int fd2 = open("oneline.txt", O_CREAT | O_WRONLY);创建文件时,应该包含第三个参数,通常是一个简单的八进制数,表示文件的权限
  • OT: about: char *buffer = (char *)malloc(sizeof(char) * 10); 表达式:sizeof(char) 在 C 标准中定义为 1。任何东西乘以 1 都没有效果。建议删除该表达式。 2) 返回的类型是void*,可以分配给任何指针。强制转换只会使代码混乱并且容易出错。建议删除该演员表。始终检查 (!=NULL) 返回值以确保操作成功。如果不成功,拨打perror()让用户知道问题,清理并退出程序
  • fdint,而不是任何类型的 struct。没有fd.file。内核确实在幕后保留了一个 struct 对应于您的 int 的值,但您绝对无法直接访问它。

标签: c buffer system-calls file-descriptor read-write


【解决方案1】:

您说的是文件偏移量。对于您的第一个问题,是的,您对此时的偏移量是正确的。对于第二个问题,您可以使用 lseek 将偏移量向后移动。要返回 2 个字符,您可以使用 lseek(fd, -2, SEEK_CUR)

【讨论】:

  • 有没有什么办法可以在不使用 lseek 的情况下移动它?我是否应该创建 fd 的副本,然后当我遇到“\n”时,将副本增加到该点?
  • @ntruter42 lseek 是移动它的方式。你为什么不想使用它?不,duping 它不起作用,因为 FD 的副本都共享相同的偏移量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 2012-06-11
  • 2015-04-14
  • 2015-10-07
  • 2019-09-28
  • 1970-01-01
相关资源
最近更新 更多