☰
系统调用1
2026/10/3 7:29:43 网站建设 项目流程

示例1:C语言 libc 包装(最常用,本质还是系统调用)

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) = 14

示例2:直接裸系统调用(不使用libc包装函数)

Linux x86_64,syscall指令,寄存器约定:

  • rax:系统调用号(write=1,exit=60)
  • rdi,rsi,rdx:第1、2、3参数
#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库函数。

示例3:纯汇编(x86_64 Linux,完全不依赖libc)

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

常见系统调用清单(x86_64 Linux)

syscallrax编号作用
SYS_read0读文件
SYS_write1写文件
SYS_open2打开文件
SYS_close3关闭文件
SYS_fork57创建子进程
SYS_exit60退出进程

参考链接 :0voice · GitHub

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询