本文深入剖析Linux系统调用的完整机制,涵盖从用户态通过syscall指令进入内核,经历栈切换、参数保存、分发处理及返回的全过程,并解释errno为何由libc设置。同时揭示clock_gettime等调用通过vDSO在用户态直接完成,无需陷入内核,最后对比两者性能差异(约6倍),强调系统调用边界成本及优化策略。
在 POSIX 中,errno 被定义为可修改的左值宏,以支持线程安全。FreeBSD 通过函数指针实现 errno,单线程时使用全局变量,线程安全时则返回各线程独立的存储。
lseek函数用于设置文件偏移量,其原型为off_t lseek(int fd, off_t offset, int whence)。whence参数可以是SEEK_SET、SEEK_CUR或SEEK_END,offset可以为正负值。Linux 3.1后新增SEEK_DATA和SEEK_HOLE。成功时返回新的偏移位置,出错时返回-1并设置errno,需重置errno以判断是否出错。
完成下面两步后,将自动完成登录并继续当前操作。