FreeBSD libc的_write定义在哪里?

时间:2014-12-29 20:32:30

标签: freebsd system-calls libc

this _write() used in stdio的代码在哪里?

A wiki page表示每个系统调用都必须在主文件和libc的Symbol.map中注册,它还表示对于Symbol.map中的每个条目都会生成三个符号:{{1} },symbol_symbol

我找到了write syscall的同意,sys_symbol_write symbol的同意,但我找不到Symbol.map的实际代码。

1 个答案:

答案 0 :(得分:0)

请记住_write是一个/非常/复杂的系统调用。由于它在文件句柄上运行,文件句柄可能是任何类型的文件系统甚至是网络套接字上的文件,因此它基本上会遍布整个内核。

您链接到的Wiki页面是开始了解FreeBSD系统调用的正确位置。如果这是你想要做的事情,写可能不是用来理解它们的最佳系统调用。

write syscall的实现(来自FreeBSD 10.0-RELEASE):

/usr/src/sys/kern/sys_generic.c:358

#ifndef _SYS_SYSPROTO_H_
struct write_args {
    int fd;
    const void *buf;
    size_t  nbyte;
};
#endif
int
sys_write(td, uap)
    struct thread *td;
    struct write_args *uap;
{
    struct uio auio;
    struct iovec aiov;
    int error;

    if (uap->nbyte > IOSIZE_MAX)
        return (EINVAL);
    aiov.iov_base = (void *)(uintptr_t)uap->buf;
    aiov.iov_len = uap->nbyte;
    auio.uio_iov = &aiov;
    auio.uio_iovcnt = 1;
    auio.uio_resid = uap->nbyte;
    auio.uio_segflg = UIO_USERSPACE;
    error = kern_writev(td, uap->fd, &auio);
    return(error);
}