commit 893e63f2195563b4deadeb9cf55355aa7710fd8d
parent 36d06359c76cb15af24a61e6fa09ee57768a6d28
Author: Henry Wilson <henry@henryandlizzy.uk>
Date: Sun, 21 Dec 2025 20:45:59 +0000
ls: use writev to batch write
Diffstat:
3 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/linux.h b/linux.h
@@ -23,10 +23,17 @@ enum {
MAP_PRIVATE = 0x2,
};
+struct iovecc
+{
+ char const* data;
+ size_t len;
+};
+
__attribute__((noreturn))
extern void exit(int error_code);
extern int read(int fd, char* data, size_t count);
extern int write(int fd, char const* data, size_t count);
+extern ssize_t writev(int fd, struct iovecc const* iov, size_t count);
extern int openat(int fd, char const* name, int flags, int mode);
extern int close(int fd);
diff --git a/ls.c b/ls.c
@@ -11,19 +11,16 @@ size_t strlen(char const* p)
return p - begin;
}
-ssize_t wr(int fd, char const* str)
-{
- return write(fd, str, strlen(str));
-}
-
int main()
{
int fd = openat(AT_FDCWD, ".", O_RDONLY, 0);
assert(fd >= 0);
struct linux_dirent64 buf[4];
+ struct iovecc ios[4];
for (;;)
{
+ unsigned n_io = 0;
ssize_t n = getdents64(fd, buf, sizeof(buf));
assert (n >= 0);
@@ -37,8 +34,9 @@ int main()
struct linux_dirent64* e = (void*)(begin + i);
size_t len = strlen(e->d_name);
e->d_name[len++] = '\n';
- write(1, e->d_name, len);
+ ios[n_io++] = (struct iovecc){e->d_name, len};
i += e->d_reclen;
}
+ writev(1, ios, n_io);
}
}
diff --git a/x86_64.s b/x86_64.s
@@ -46,6 +46,7 @@ _syscall 0 syscall3 read
_syscall 1 syscall3 write
_syscall 3 syscall3 close
_syscall 9 syscall6 mmap
+_syscall 20 syscall3 writev
_syscall 60 syscall3 exit
_syscall 217 syscall3 getdents64
_syscall 257 syscall6 openat