1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
const std = @import("std");
// https://github.com/ghostty-org/ghostty/blob/9fb03ba55c9e53901193187d5c43341f5b1b430d/src/pty.zig#L11
pub const winsize = extern struct {
ws_row: u16 = 100,
ws_col: u16 = 80,
ws_xpixel: u16 = 800,
ws_ypixel: u16 = 600,
};
var gpa: std.heap.GeneralPurposeAllocator(.{}) = .init;
const alloc = gpa.allocator();
const ArrayList = std.ArrayList;
pub fn main() !void {
var child = std.process.Child.init(&.{"./study-samples/split"}, alloc);
child.stdin_behavior = .Pipe;
child.stdout_behavior = .Pipe;
child.stderr_behavior = .Pipe;
var stdin_buf: [0x100]u8 = undefined;
var stdin = std.fs.File.stdin().readerStreaming(&stdin_buf);
var stdout: ArrayList(u8) = .empty;
defer stdout.deinit(alloc);
var stderr: ArrayList(u8) = .empty;
defer stderr.deinit(alloc);
try child.spawn();
var child_writer_buf: [0x100]u8 = undefined;
var child_stdin_writer = child.stdin.?.writer(&child_writer_buf);
while (true) {
if (stdin.interface.streamDelimiter(&child_stdin_writer.interface, '\n')) |_| {} else |_| {
break;
}
// if (n == 0) break;
_ = try child_stdin_writer.interface.writeByte('\n');
if (child_stdin_writer.interface.flush()) |_| {} else |_| {
break;
}
try child.collectOutput(alloc, &stdout, &stderr, 0x1000);
std.debug.print("{s}\n {s}\n", .{ stdout.items, stderr.items });
}
errdefer {
_ = child.kill() catch {};
}
const term = try child.wait();
switch (term) {
.Signal => |s| {
inline for (@typeInfo(std.os.linux.SIG).@"struct".decls) |f| {
const field = @field(std.os.linux.SIG, f.name);
const t = @TypeOf(field);
if (t == comptime_int) {
if (field == s)
std.debug.print("Returned with Signal: {s} ({d})\n", .{ f.name, s });
}
}
},
else => std.debug.print("{any}\n", .{ .term = term }),
}
// std.debug.print("*** If you this message alone... Something probably went wrong\nIs this leaking? {any}\n", .{gpa.detectLeaks()});
}
|