liblinux++

Log | Files | Refs

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:
Mlinux.h | 7+++++++
Mls.c | 10++++------
Mx86_64.s | 1+
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