词条 | gethostname() |
释义 | 简述:返回本地主机的标准主机名。 #include <Winsock2.h> int PASCAL FAR gethostname(char FAR *name, int namelen); name: 一个指向将要存放主机名的缓冲区指针。 namelen:缓冲区的长度。 注释:该函数把本地主机名存放入由name参数指定的缓冲区中。返回的主机名是一个以NULL结束的字符串。主机名的形式取决于Windows Sockets实现-它可能是一个简单的主机名,或者是一个域名。然而,返回的名字必定可以在gethostbyname()和WSAAsyncGetHostByName()中使用。 返回值:如果没有错误发生,gethostname()返回0。否则它返回SOCKET_ERROR。应用程序可以通过WSAGetLastError()来得到一个特定的错误代码。 错误代码:WSAEFAULT 名字长度参数太小。 WSANOTINTIALISED 在应用这个API前,必须成功地调用WSAStartup()。 WSAENTDOWN Windows Sockets实现检测到了网络子系统的错误。 WSAEINPROGRESS 一个阻塞的Windows Sockets操作正在进行。 参见:gethostbyname(), WSAAsyncGetHostByName() 函数分析#include <stdio.h> #include <unistd.h> int main() { char name[65]; gethostname(name, sizeof(name)); printf("hostname = %s\", name); } 编译运行 --------------------------------- # gcc test.c # ./a.out hostname = zxl # uname -n zxl 理论分析 --------------------------------- task_struct |-----------| struct nsproxy | | -+-->|------------| | | -| | count | | | -| | nslock | struct uts_namespace | | -| | *uts_ns |---->|---------------------| |-----------| -| | *ipc_ns | | kref | | *nsproxy -|--+ | *namespace | |---------------------| |-----------| |------------| | char sysname[65] | | | | char nodename[65] | | | | char release[65] | | | struct new_utsnamename | char version[65] | | | | char machine[65] | |-----------| | char domainname[65] | |---------------------| /usr/src/linux-2.6.19/kernel/sys.c asmlinkage long sys_gethostname(char __user *name, int len) { int i, errno; if (len < 0) return -EINVAL; down_read(&uts_sem); i = 1 + strlen(utsname()->nodename); if (i > len) i = len; errno = 0; if (copy_to_user(name, utsname()->nodename, i)) errno = -EFAULT; up_read(&uts_sem); return errno; } utsname() -- 返回当前进程的new_utsname结构 /usr/src/linux-2.6.19/include/linux/utsname.h static inline struct new_utsname *utsname(void) { return ¤t->nsproxy->uts_ns->name; } |
随便看 |
|
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。