上网第八课:千兆宽带时代的正确姿势:从办理到组网的完整清单
2026/10/3 13:48:20
write系统调用,往标准输出打印字符串
#include <unistd.h> int main(void) { const char msg[] = "hello syscall\n"; // write(int fd, const void *buf, size_t count) // fd=1:stdout,底层对应 sys_write write(1, msg, sizeof(msg)-1); return 0; }编译运行:
gcc write.c -o write ./write用strace看系统调用:
strace ./write # 会看到 write(1, "hello syscall\n", 14) = 14Linux x86_64,syscall指令,寄存器约定:
#include <sys/syscall.h> int main(void) { const char msg[] = "raw syscall\n"; // SYS_write = 1 syscall(SYS_write, 1, msg, sizeof(msg)-1); // SYS_exit = 60 syscall(SYS_exit, 0); }
syscall()是glibc提供的通用函数,直接传入syscall编号,不依赖write库函数。
sys.asm
section .data msg db "asm syscall hello",0xa len equ $ - msg section .text global _start _start: ; write(1, msg, len) mov rax, 1 ; sys_write mov rdi, 1 ; fd stdout mov rsi, msg mov rdx, len syscall ; exit(0) mov rax, 60 ; sys_exit mov rdi, 0 syscall编译运行:
nasm -f elf64 sys.asm -o sys.o ld sys.o -o sys ./sys strace ./sys| syscall | rax编号 | 作用 |
|---|---|---|
| SYS_read | 0 | 读文件 |
| SYS_write | 1 | 写文件 |
| SYS_open | 2 | 打开文件 |
| SYS_close | 3 | 关闭文件 |
| SYS_fork | 57 | 创建子进程 |
| SYS_exit | 60 | 退出进程 |
参考链接 :0voice · GitHub