返回信息流有一个dll,里面有一个全局变量FILE *f,用来往指定的文件里写入信息fopen a+。
当我在不同进程调用此dll时,如何保证各进程按顺序写入呢?这个变量f需要用#pragma comment(linker, "/SECTION:xxx,SRW")设置成共享的变量么?
目前我的做法:
写入文件是用createMutex进行读写控制,fputs(buf)写文件
1、把f用 #pragma comment设成共享变量时,只有第一次加载dll的进程可以正常写,其他进程没有写到文件中
2、不设成共享变量,看似进程间可以正常写,但这周方法貌似每个进程的FILE *f是不同的,如何保证写入时自动seek到文件尾呢?
关于dll中共享文件描述符写文件的问题,请达人解答。。
这是一条镜像帖。来源:北邮人论坛 / cpp / #43886同步于 2010/9/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于dll共享变量问题
cba
2010/9/14镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
不同进程共享同一个文件指针不是一个好习惯。
这样说吧,
在windows上
fopen -> CreateFile 所以这就涉及到一个问题,文件句柄是内核结构,还是进程独有结构。如果是内核结构,那么不同进程共享一个文件句柄自然不会有问题,因为内核为所有进程所共享;但如果文件句柄是进程独有结构的话,那就会出问题,也就是说进程1打开的文件句柄放在进程2上是没有意义的。windows文件句柄是内核结构还是进程独有结构,我没有去深究,所以无法给出确切答案。
但如果放在Linux上面的话:
fopen -> open 所以linux的文件句柄是进程独有的,也就是说进程1所打开文件产生的文件句柄在进程2上是没有意义的。所以,即使共享文件指针,最后结果也是会有问题的。当然了,我没去验证,如果有兴趣的话,大家可以验证下。
所以,共享文件指针不是一个好习惯,很有可能会出错。如果想不同进程操作同一个文件的话,最好重复打开同一个文件,然后进行相应的操作,当然了,一定要设计到进程的互斥操作。
【 在 jmpesp 的大作中提到: 】
: 不同进程共享同一个文件指针不是一个好习惯。
: 这样说吧,
: 在windows上
: ...................
如果process A,B都各"a+"自打开XX.txt,写入的时候如何保证写的时候会最加到当前的文件末尾呢?我用fseek不好使。。。
【 在 cba 的大作中提到: 】
: 如果process A,B都各"a+"自打开XX.txt,写入的时候如何保证写的时候会最加到当前的文件末尾呢?我用fseek不好使。。。
fseek咋不好使呢? 只是不通进程写或者fseek的时候要注意进程间互斥,不然会出错
加锁\互斥变量\发消息\
等等多线程同步的方法
【 在 cba (祖国的花朵) 的大作中提到: 】
: 如果process A,B都各"a+"自打开XX.txt,写入的时候如何保证写的时候会最加到当前的文件末尾呢?我用fseek不好使。。。
太麻烦了……直接锁死文件打开,写完关了,下一个再锁死打开,打不开的就打酱油去
【 在 cba (祖国的花朵) 的大作中提到: 】
: 有一个dll,里面有一个全局变量FILE *f,用来往指定的文件里写入信息fopen a+。
: 当我在不同进程调用此dll时,如何保证各进程按顺序写入呢?这个变量f需要用#pragma comment(linker, "/SECTION:xxx,SRW")设置成共享的变量么?
: 目前我的做法:
: ...................