linux - 是否每次调用 write 都会切换到内核模式?

标签 linux linux-kernel glibc


我知道对 glibc“写入”函数的调用会调用内核函数 sys_call 写入函数。
因为 sys_call 是内核函数,所以 CPU 必须将环更改为零来存储进程寄存器等等。
但是它总是切换到内核模式吗?例如,如果我这样做

write(-1,buffer,LENGTH)

它是否仍然试图在文件描述符数组中找到它?
我在 glibc 源代码中看到它确实检查了 fd>0,但我没有看到任何跳转到那里的 sys_call(似乎 main() 的 baracks 在任何调用 alias_write 之前结束。
< br/>

/* Write NBYTES of BUF to FD.  Return the number written, or -1.  */
ssize_t
__libc_write (int fd, const void *buf, size_t nbytes)
{
  if (nbytes == 0)
    return 0;
  if (fd < 0)
    {
      __set_errno (EBADF);
      return -1;
    }
  if (buf == NULL)
    {
      __set_errno (EINVAL);
      return -1;
    }

  __set_errno (ENOSYS);
  return -1;
}
libc_hidden_def (__libc_write)
stub_warning (write)

weak_alias (__libc_write, __write)
libc_hidden_weak (__write)
weak_alias (__libc_write, write)
#include <stub-tag.h>

所以问题是:

  1. glibc 实际上在哪里调用 sys_write
  2. 如果 fd<0,glibc 不调用 sys_write 是真的吗?

最佳答案

I see in the glibc source code that it does check for fd>0 but i don't see any jump to the sys_call there

您正在查看错误的代码。

__libc_write有多种定义,在不同的条件下使用。您查看的那个在 io/write.c 中。

在 Linux 上实际使用的那个是从 sysdeps/unix/syscall-template.S 生成的,它确实实际执行即使在 fd==-1 等情况下也切换到内核模式(并返回用户模式)

关于linux - 是否每次调用 write 都会切换到内核模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48623453/

相关文章:

python -c 和 `while`

python - 如何在不中断音乐/其他声音播放的情况下在 Python 中播放声音

android - top vs/proc/pid/stat 哪个更适合cpu%使用率计算

linux - 如何或修改 KVM 中的 CPUID 模拟代码中的哪个文件来报告虚构的处理器品牌字符串(CPUID leaf 0x0)?

linux - 在 glibc 的 malloc 中使用 POSIX 信号量

使用 makefile 编译 C 项目

linux - 如何在 Linux 服务器上从 Apache SVN 归档旧版本

linux - 为什么linux系统调用跨架构不同

ssh - 通过 SSH 使用 ipython notebook 会导致 GLIBC not found 错误

linux - 减少 libstdc 和 libstdc++ 版本而不将构建服务器移动到旧操作系统