arbow发现的问题如下:
4> file:read_file("/proc/cpuinfo").
{ok,<<>>}
11> {ok, IoDevice} = file:open("/proc/cpuinfo", [binary]),file:read(IoDevice, 1024).
{ok,<<"processor\t: 0\nvendor_id\t: GenuineIntel\ncpu family\t: 6\nmodel\t\t: 15\nmodel name\t: Intel(R) Core(TM)2 CPU "...>>}
同样的虚拟文件 不同的读法一个有内容 一个没有。
真实的文件就不存在这个问题。
erl -smp disable (禁止多smp的原因是容易找到pid)
strace -p PID
结果如下:
。。。。
stat("/proc/cpuinfo", {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
open("/proc/cpuinfo", O_RDONLY) = 7
close(7) = 0
stat("/proc/cpuinfo", {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
open("/proc/cpuinfo", O_RDONLY) = 7
poll([{fd=3, events=POLLIN|POLLRDNORM}, {fd=5, events=POLLIN|POLLRDNORM}, {fd=0, events=POLLIN|POLLRDNORM}], 3, 0) = 0
clock_gettime(CLOCK_MONOTONIC, {457571, 853399847}) = 0
read(7, "processor\t: 0\nvendor_id\t: Genuin"..., 8192) = 1238
看下源码红色部分:
static void invoke_read_file(void *data)
{
struct t_data *d = (struct t_data *) data;
size_t read_size;
int chop;
if (! d->c.read_file.binp) {
int fd;
int size;
if (! (d->result_ok =
efile_openfile(&d->errInfo, d->c.read_file.name,
EFILE_MODE_READ, &fd, &d->c.read_file.size))) {
goto done;
}
d->fd = fd;
size = (int) d->c.read_file.size;
if (size != d->c.read_file.size ||
! (d->c.read_file.binp = driver_alloc_binary(size))) {
d->result_ok = 0;
d->errInfo.posix_errno = ENOMEM;
goto close;
}
d->c.read_file.offset = 0;
}
read_size = (size_t) (d->c.read_file.size - d->c.read_file.offset);
if (! read_size) goto close;
chop = d->again && read_size >= FILE_SEGMENT_READ*2;
if (chop) read_size = FILE_SEGMENT_READ;
d->result_ok =
efile_read(&d->errInfo,
EFILE_MODE_READ,
(int) d->fd,
d->c.read_file.binp->orig_bytes + d->c.read_file.offset,
read_size,
&read_size);
if (d->result_ok) {
d->c.read_file.offset += read_size;
if (chop) return; /* again */
}
close:
efile_closefile((int) d->fd);
done:
d->again = 0;
}
static void invoke_read(void *data)
{
struct t_data *d = (struct t_data *) data;
int status, segment;
size_t size, read_size;
segment = d->again && d->c.read.bin_size >= 2*FILE_SEGMENT_READ;
if (segment) {
size = FILE_SEGMENT_READ;
} else {
size = d->c.read.bin_size;
}
read_size = size;
if (d->flags & EFILE_COMPRESSED) {
read_size = erts_gzread((gzFile)d->fd,
d->c.read.binp->orig_bytes + d->c.read.bin_offset,
size);
status = (read_size != -1);
if (!status) {
d->errInfo.posix_errno = EIO;
}
} else {
status = efile_read(&d->errInfo, d->flags, (int) d->fd,
d->c.read.binp->orig_bytes + d->c.read.bin_offset,
size,
&read_size);
}
if ( (d->result_ok = status)) {
ASSERT(read_size <= size);
d->c.read.bin_offset += read_size;
if (read_size < size || !segment) {
d->c.read.bin_size = 0;
d->again = 0;
} else {
d->c.read.bin_size -= read_size;
}
} else {
d->again = 0;
}
}
也就是说read_file 在发现文件长度为0的时候
不进行进一步读取.所以使用的时候请注意。
分享到:
相关推荐
(方法.read_csv(“ your_csv_file.csv”)) import pandas as pddf = pd.read_csv("new_york_city.csv")使用整数索引从日期框架打印行 :card_file_box: 使用10到20的整数索引从日期帧打印10行。 (方法.iloc ...
"VC_read_file_line_code.rar"这个压缩包提供的经典代码着重于如何在VC++中实现逐行读取文件的功能。这是一个基础但非常实用的技巧,尤其在处理大量文本数据时。下面将详细介绍如何在VC++中实现这一功能。 首先,...
"Read_image_file.rar" 文件包含了一个名为 "Read_image_file.vi" 的虚拟仪器(VI),它专门用于帮助用户实现这个功能。下面将详细介绍如何在LabVIEW中读取和显示图片,以及该VI可能实现的操作。 1. **读取图片**: ...
DaSiamRPN 是一种基于深度学习的目标跟踪算法,其模型文件通常用于跟踪任务。在代码中,TrackerDaSiamRPN::create() 函数调用创建了 DaSiamRPN 目标跟踪器的实例,它依赖于 "dasiamrpn_model.onnx" 模型文件。...
标题"read_ENVI_head_file_head_envi_"暗示了我们要讨论的是如何读取ENVI头文件(.hdr)。 ENVI头文件是文本格式,包含了关于图像数据的重要元数据,如波段数量、每个像素的位数、空间分辨率、投影信息等。这些信息...
将labview中TDMS文件数据导入matlab工作区
标题中的"read_write_TXT_file.rar_csv_read_txt_file"暗示了我们将在C语言环境中处理TXT文件,特别是涉及到CSV(逗号分隔值)格式的文件。CSV文件是一种常见的数据存储格式,通常用于导入和导出表格数据,如在电子...
read_file.py是工作文件,file_test.py是读取文件源,write_test.py是写入目标文件。 文件A:file_test.py #coding=utf-8 for i in range(1, 10): print i 文件B:read_file.py # coding=utf-8 # 打开件A f = ...
file.Read(buffer, sizeof(buffer), &bytesRead); ``` `Read()`函数会返回实际读取的字节数,并将其存储在`bytesRead`变量中。需要注意的是,我们通常需要检查是否已到达文件末尾,可以通过`Eof()`函数来实现: ``...
file_read_write.py
提问我循环用file_get_contents抓取一堆url,但总是会在不到第100个URL的时候停下,提示我:“Warning: file_get_contents(URL) [function.file-get-contents]: failed to open stream: HTTP request failed...
首先,"Read_SIM_File.rar_SIM ID_read sim_sim read_sim read bina"这个标题暗示了一个程序或工具,它能够读取SIM卡上的特定文件,特别是通过指定的SIM ID。SIM ID通常指的是SIM卡中的ICCID(Integrated Circuit ...
最后,我们注意到"file_read_and_write"这个标签,它提醒我们在实际编程中,应当注意处理可能的异常,确保文件操作的健壮性。在上述所有操作中,都建议使用`try/except`块来捕获并处理可能出现的错误,例如文件不...
import csv file=r'd:/4.csv' class CSV_Analyse: def _read_csv (self,file): reader =csv.reader(open(file,"rd")) return [line for line in self.codes(reader)] def codes(self,reader): for line in reader: ...
An error occurred while downloading the remote file. The error message, if any, is reproduced below. Please fix this error and try again. OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 54 这个错误是因为...
void TextFile::read() { // 实现读取文件内容 } void TextFile::write(const std::string& content) { // 实现写入文件内容 } ``` 这样的类可以方便地对指定的TXT文件进行读写操作。 以上就是关于使用C++...
Erlang的文件操作API(如`file:list_dir/1`、`file:open/2`、`file:read_line/1`和`file:close/1`)是处理文件系统操作的核心部分。它们提供了一种安全且并发友好的方式来访问和操作文件。`filename:join/1,2`函数...
df = pd.read_pickle( output_file ) df=df[start_date:end_date] except FileNotFoundError: df = pdr.DataReader( stock_symbol, "yahoo", start_date, end_date ) df.to_pickle( output_file ) return df
print(f"Processing file: {file}") # 在这里可以进行数据处理或分析 ``` `pd.read_excel()`函数可以读取Excel文件,并将其内容转换为一个DataFrame对象,这是pandas处理表格数据的主要数据结构。你可以选择指定...
with open('example.txt', 'w') as file: file.write('这是写入文件的内容') # 读取文件 with open('example.txt', 'r') as file: content = file.read() print(content) ``` 标签“file操作”暗示了我们将讨论...