文件系统-两个相同句柄文件指针偏移问题

问题描述

两个相同句柄文件指针偏移问题

两个相同句柄文件指针偏移,其中一个文件指针偏移,另外一个也会被偏移吗?我看论坛上的博客说:
两个不同的文件描述符,若指向同一个打开文件句柄,将共享同一文件偏移量。因此,如果通过其中一个文件描述符来修改文件偏移量(由调用read()、write()或lseek()所致),那么从另一个描述符中也会观察到变化,无论这两个文件描述符是否属于不同进程,还是同一个进程,情况都是如此。
但我自己编的一个demo并没有达到这个说法的效果,是为什么呢?麻烦各位给个解答。

 #include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

//seek.txt的内容是abcdefghijklmnopqrstyvwxyz

int main()
{
    int fd1 = -1, fd2 = -1;
    char buf1[10] = {0};
    char buf2[5] = {0};
    fd1 = open("seek.txt", O_RDONLY);           //打开同一个文件,是不是指文件描述符表中文件指针相同
    fd2 = open("seek.txt", O_RDONLY);
    lseek(fd1, 5, SEEK_SET);
    printf("now we seek!n");

    read(fd1, buf1, 5);
    printf("the fd1 content is [%s], the fd1 is [%d]n", buf1, fd1);    //这里打印出来是fghij

    read(fd2, buf2, 5);
    printf("the fd2 content is [%s], the fd2 is [%d]n", buf2, fd2);//这里打印出来为什么是abcdefghij, 而不是hijkl

    close(fd1);
    close(fd2);

    return 0;
}

解决方案

你确认你测试的环境,与论坛博客的环境是一样的?
不同的编译器的处理可能是不相同的,以实际的测试结果为准吧。
另外,你的代码中 buf2 容易出现越界的情况,需要注意。如果真如博客所说,读到的也应该是 klmno。

解决方案二:

当然不会,每个句柄有一个指针,

解决方案三:

@91program 恩,谢谢。刚发现那个越界的危险。博客中并没有提及编译环境,那也就是说不同的编译器会有不同的结果是吧

时间: 2024-12-01 21:47:19

文件系统-两个相同句柄文件指针偏移问题的相关文章

linux驱动开发--字符设备:添加文件指针偏移的功能

设备移位操作llseek 对应lseek系统调用的设备移位操作为llseek 默认情况为允许设备移位操作 大部分字符设备提供的都是数据流而不是一个数据区,比如串口,对于这些设备而言移位操作毫无意义 设备可选择是否支持移位操作 支持设备移位操作loff_t (*llseek)(struct file *filp, loff_t off, int whence);filp:待操作的设备文件file结构体指针off:待操作的定位偏移值(可正可负)whence:待操作的定位起始位置返回:返回移位后的新文

linux中文件描述符fd和文件指针flip的理解

整理自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html 简单归纳:fd(file descriptor)只是一个整数,在open时产生.起到一个索引的作用.每个进程在PCB(Process Control Block)即进程控制块中都保存着一份文件描述符表,文件描述符就是这个表的索引,文件描述表中每个表项都有一个指向已打开文件的指针,进程通过PCB中的文件描述符表找到该fd所指向的文件指针filp. 文件描述符的操作(如:

关于利用fgets()改变文件指针位置再利用fprintf()更新文件数据的一些小疑问求教

问题描述 关于利用fgets()改变文件指针位置再利用fprintf()更新文件数据的一些小疑问求教 下面便是一个更新卡信息文件数据的函数updateCard int updateCard(const char* CardPath,const Card* pcard,int nIndex) {//更新卡信息文件中的数据,CardPath为文件路径,pcard为指向要更新的卡信息结点的指针,nIndex为卡信息在文件中的索引号(即在卡信息文件中的行数) FILE* fp = NULL; long

c++-C++open后如何找到文件指针地址

问题描述 C++open后如何找到文件指针地址 大家好,我以往用C编程,现在在尝试融合两个工程,但工程用C++写的,fd.read(buf, length)读文件,我想知道从fd中怎么找到指向文件的指针,我想把指针地址传给另一个工程 解决方案 两个工程,需要把其中一个编译为dll 解决方案二: 指针地址长度 解决方案三: fd.read的fd肯定是一个类!求指针用&fd 解决方案四: 看不懂,描述不是很清晰.首先open的对象是一个文件(或设备),打开之后返回一个文件描述符fd,如果设备或者文件

c语言-C语言中A文件定义的文件指针,如何才能在B文件中也可以写入信息

问题描述 C语言中A文件定义的文件指针,如何才能在B文件中也可以写入信息 image.c和rtp.c都不是主函数,在image.c中定义了一个文件指针,但我想把rtp.c中的信息写入这个文件.简单就是在A文件中定义了一个指针文件,想把B文件中的信息写入指针文件.你可能问我为什么不直在B文件中定义,因为也要写入A文件中信息,像我之前写的运行时会提示rtp.c中的文件指针是未定义的标识符. 应该怎么写才是正确,麻烦知道的人给点指导,谢谢 解决方案 通过extern在rtp.c中声明该文件指针为外部指

操作-c#打开excel后在手动打开excel两个excel句柄一样

问题描述 c#打开excel后在手动打开excel两个excel句柄一样 我又重新编辑了一下 1.打开软件 2..点文件打开 3.打开psy++ 4.手动打开了一个excel 5.spy++查看 这个时候我软件本来是要操作之前打开的report.xlsx, 就变成了操作新建 Microsoft Office Excel 2007 Workbook.xlsx了... 下面是打开程序 public static Excel._Application reportExcel; public stati

carchive-CArchive的文件指针位置和CFile的文件指针位置是一样的么?

问题描述 CArchive的文件指针位置和CFile的文件指针位置是一样的么? void Add::OnClickedIdbAdd() { // TODO: Add your control notification handler code here UpdateData(); if (!m_aComp || !m_aEng || !m_aMath || !m_aGym || m_aName=="" || m_aSno=="" || m_aMajor=="

c++ fstream 文件读写-C++ fstream读写文件 文件指针

问题描述 C++ fstream读写文件 文件指针 ifstream file; ....... //中间有读写文件操作 int i; i = file.tellg(); file >> str1; file.seekg(i); file >> str2; 请问 这两个 str为什么不一样 我确认 在file>>str1和file>>str2这两个语句之前 seekg() 返回的值是一样的 解决方案 读写文件(fstream)用fstream对二进制文件的读

c++ 由类型转换引起的指针偏移

由于转载了另外的转载,且原文暂时未找到,此处无法列出原文地址. 在C语言中,如果对一个指针做类型转换,不会改变这个指针的值,改变的只是对指针的解释方式.但是在C++中,由于一些特性的引入,在对指针做类型转换时,编译器有时不得不对指针做一个偏移,以支持这些特性.下面将具体讨论这些情况.1. 由虚函数引起的指针偏移通常在有虚函数的类中,编译器会安插一个vptr,但是对vptr的位置C++语言并未做出明确的规定,就目前的实现来看,有的编译器将vptr放在类的开头,如microsoft的c++编译器,而