以把一个描述符改为非阻塞为例: ``` #include <fcntl.h> #include <unistd.h> int set_nonblock(int fd) { int flags = fcntl(fd, F_GETFL); /* 先取当前标志,rax=72 */ if (flags < 0) return -1; if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) < 0) /* 叠加非阻塞位,rax=72 */ return -1; return 0; } ``` 链路:用户态 `fcntl()` → glibc 置 `rax=72`,`rdi=fd`、`rsi=cmd`、`rdx=arg` → `syscall` 陷入 → 内核 `do_fcntl()` 按命令修改文件表项标志 → `sysret` 返回。`openat` 则置 `rax=257`,陷入后内核按路径与标志定位或创建文件,返回新描述符。 ``` # 观察fcntl对描述符标志的控制调用 s