this _write() used in stdio的代码在哪里?
A wiki page表示每个系统调用都必须在主文件和libc的Symbol.map中注册,它还表示对于Symbol.map中的每个条目都会生成三个符号:{{1} },symbol
和_symbol
。
我找到了write syscall的同意,sys_symbol
中_write symbol的同意,但我找不到Symbol.map
的实际代码。
答案 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);
}