This seems silly, I must be overlooking something obvious.
I’m trying to read the entire contents of /proc/version into a buffer. Saw std.Io.Dir.readFileAlloc() looked simple enough, but I keep getting 0 bytes back. No error, just an empty buffer. If I attempt the same thing with a more verbose std.Io.Dir.readSliceShort(), it works just fine. Here’s two test cases.
test "WORKS - read /proc/version with readSliceShort()" {
const proc_dir = try Io.Dir.openDirAbsolute(testing.io, "/proc", .{ .iterate = false });
defer proc_dir.close(testing.io);
const proc_version_file = try proc_dir.openFile(testing.io, "version", .{
.mode = .read_only,
.allow_directory = false,
});
defer proc_version_file.close(testing.io);
var file_reader = proc_version_file.reader(testing.io, &.{});
var intf = &file_reader.interface;
var file_buf: [1024]u8 = undefined;
const len = try intf.readSliceShort(
&file_buf,
);
const file_contents = file_buf[0..len];
print("{d} bytes\n", .{file_contents.len});
print("\"{s}\"\n\n", .{file_contents});
try testing.expect(file_contents.len > 0);
}
test "FAILS - read /proc/version with readFileAlloc()" {
const proc_dir = try Io.Dir.openDirAbsolute(testing.io, "/proc", .{ .iterate = false });
defer proc_dir.close(testing.io);
const file_contents = try proc_dir.readFileAlloc(
testing.io,
"version",
testing.allocator,
.limited(4096),
);
defer testing.allocator.free(file_contents);
print("{d} bytes\n", .{file_contents.len});
print("\"{s}\"\n\n", .{file_contents});
try testing.expect(file_contents.len > 0);
}
const Io = @import("std").Io;
const print = @import("std").debug.print;
const testing = @import("std").testing;
On my machine I get the following output:
$ zig version
0.16.0
$ zig test ./src/read_proc_version.zig
213 bytes
"Linux version 6.12.100+deb13-amd64 (debian-kernel@lists.debian.org) (x86_64-linux-gnu-gcc-14 (Debian 14.2.0-19) 14.2.0, GNU ld (GNU Binutils for Debian) 2.44) #1 SMP PREEMPT_DYNAMIC Debian 6.12.100-1 (2026-07-30)
"
0 bytes
""
2/2 read_proc_version.test.FAILS - read /proc/version with readFileAlloc()...FAIL (TestUnexpectedResult)
/home/alex/opt/zig-x86_64-linux-0.16.0/lib/std/testing.zig:615:14: 0x12388f9 in expect (std.zig)
if (!ok) return error.TestUnexpectedResult;
^
/home/alex/devel/zigko/src/read_proc_version.zig:40:5: 0x1238bb3 in test.FAILS - read /proc/version with readFileAlloc() (read_proc_version.zig)
try testing.expect(file_contents.len > 0);
^
1 passed; 0 skipped; 1 failed.
error: the following test command failed with exit code 1:
.zig-cache/o/4bb3371dc7a3aacb6b73029e5f20a14f/test --seed=0xe1c60156