- 主题:两个进程一个只写一个只读一个文件,如何保证读到完整数据
我定义了一个struct, 24byte, 每次调用fwrite(&buf, 24, 1, fw)来写24byte到文件中(binary mode)
在读进程中,我用fread(&buf, 24, 1, fr)来读,但我发现在某些时候,会读失败,可能读到少于24个bytes, 然后我也没办法把读到的数据退回到字符流中,所以后面再读时,整个序列全乱了,
不知道有什么办法可以解决这个问题,而不牺牲性能。
我主要是想一个进程写, 写完就尽快退出。
读尽量早的开始,读出来二进制数据后,格式化输出成可读log
--
FROM 64.207.220.*
说一下,我的方案,其实只要每次读前保存一下文件指针,如果读失败就回退指针。 这样就可以避免读到不完整的数据了
--
FROM 64.207.220.*
你是有什么理由一定要用文件做进程通信么?
--
FROM 117.136.52.*
我知道用shared memory性能好, 或者其他的
但shared memory需要定义shared memory name, 当crash时, 需要清理/dev/shared memory
当有多个实例时,也需要保证一一匹配。
socket需要定义好socket port, 保证两个进程一一对应。
我的场景其实是运行verilog仿真,然后通过DPI-C来把数据写到磁盘上,为了节省时间,我就写成binary格式, 然后再通过另一个进程来把binary格式写成另一个EDA tools需要的格式。
如果我在DPI-C中用另一个线程来做format, 这样我的仿真主线程就退不出,所以我考虑用一个独立的进程来做。
总体来说我为了方便性, 所以用了最土的方法。
【 在 lwp 的大作中提到: 】
: 你是有什么理由一定要用文件做进程通信么?
--
FROM 64.207.220.*
加锁
【 在 eematlab 的大作中提到: 】
: 我定义了一个struct, 24byte, 每次调用fwrite(&buf, 24, 1, fw)来写24byte到文件中(binary mode)
: 在读进程中,我用fread(&buf, 24, 1, fr)来读,但我发现在某些时候,会读失败,可能读到少于24个bytes, 然后我也没办法把读到的数据退回到字符流中,所以后面再读时,整个序列全乱了,
: 不知道有什么办法可以解决这个问题,而不牺牲性能。
: ...................
--
FROM 14.24.54.*
文件映射是不是可以让你处理这个问题起来更方便?
【 在 eematlab 的大作中提到: 】
: 我定义了一个struct, 24byte, 每次调用fwrite(&buf, 24, 1, fw)来写24byte到文件中(binary mode)
: 在读进程中,我用fread(&buf, 24, 1, fr)来读,但我发现在某些时候,会读失败,可能读到少于24个bytes, 然后我也没办法把读到的数据退回到字符流中,所以后面再读时,整个序列全乱了,
: 不知道有什么办法可以解决这个问题,而不牺牲性能。
: ...................
--
FROM 216.113.160.*
通讯...
【 在 eematlab 的大作中提到: 】
: 我定义了一个struct, 24byte, 每次调用fwrite(&buf, 24, 1, fw)来写24byte到文件中(binary mode)
: 在读进程中,我用fread(&buf, 24, 1, fr)来读,但我发现在某些时候,会读失败,可能读到少于24个bytes, 然后我也没办法把读到的数据退回到字符流中,所以后面再读时,整个序列全乱了,
: 不知道有什么办法可以解决这个问题,而不牺牲性能。
: ...................
--
FROM 142.59.143.*
使用若干小文件,比方说每个1MB,只去读已经写好的文件
【 在 eematlab 的大作中提到: 】
: 我定义了一个struct, 24byte, 每次调用fwrite(&buf, 24, 1, fw)来写24byte到文件中(binary mode)
: 在读进程中,我用fread(&buf, 24, 1, fr)来读,但我发现在某些时候,会读失败,可能读到少于24个bytes, 然后我也没办法把读到的数据退回到字符流中,所以后面再读时,整个序列全乱了,
: 不知道有什么办法可以解决这个问题,而不牺牲性能。
: ...................
--
FROM 221.218.212.*
如果非要文件,就使用ab两个文件。交叉读写,用一个原子整数负责指示。
反正我以前用大型数据结构就是这样操作的,性能好,也没有脏数据。
话说文件性能很差,加锁的性能损失和文件io比较起来可以忽略了吧
【 在 eematlab 的大作中提到: 】
: 我定义了一个struct, 24byte, 每次调用fwrite(&buf, 24, 1, fw)来写24byte到文件中(binary mode)
:
: 在读进程中,我用fread(&buf, 24, 1, fr)来读,但我发现在某些时候,会读失败,可能读到少于24个bytes, 然后我也没办法把读到的数据退回到字符流中,所以后面再读时,整个序列全乱了,
: ...................
--来自微水木3.5.2
--
FROM 223.167.168.*
在共享内存里开ring buffer,开大点。
写索引和读索引。
读进程一次性多读一些数据,避免高频写硬盘。
【 在 eematlab () 的大作中提到: 】
: 我定义了一个struct, 24byte, 每次调用fwrite(&buf, 24, 1, fw)来写24byte到文件中(binary mode)
:
: 在读进程中,我用fread(&buf, 24, 1, fr)来读,但我发现在某些时候,会读失败,可能读到少于24个bytes, 然后我也没办法把读到的数据退回到字符流中,所以后面再读时,整个序列全乱了,
:
--
FROM 221.220.247.*