linux下的socket在哪个头文件,socket函数在哪个文件定义,解决方案
当前位置:我的异常网» Linux/Unix » socket函数在哪个文件定义,解决方案
socket函数在哪个文件定义,解决方案
www.myexceptions.net 网友分享于:2015-01-10 浏览:0次
socket函数在哪个文件定义,
我想知道socket函数在哪里定义的,具体的实现过程。
比如一些函数可以再/usr/include/中的头文件中找到,但是socket函数却找不到。
那么socket函数执行时,会调用哪些函数呢,求大神指教。
------解决思路----------------------
socket函数是由glibc提供的,可以在glibc 源代码的include/sys/socket.h文件中找到上述socket函数的声明,这些函数的真正实现比较难找,对于x86体系来说,相关源文件在sysdeps/unix/sysv/linux/i386/socket.S,这是用汇编实现的,用来从用户空间进入名为socketcall的系统调用,并传递参数,下面是相关汇编代码:
.globl __socket
ENTRY (__socket)
#if defined NEED_CANCELLATION && defined CENABLE
SINGLE_THREAD_P
jne 1f
#endif
/* Save registers. */
movl %ebx, %edx
cfi_register (3, 2)
movl $SYS_ify(socketcall), %eax /* System call number in %eax. */
/* Use ## so `socket' is a separate token that might be #define'd. */
movl $P(SOCKOP_,socket), %ebx /* Subcode is first arg to syscall. */
lea 4(%esp), %ecx /* Address of args is 2nd arg. */
/* Do the system call trap. */
ENTER_KERNEL
/* Restore registers. */
movl %edx, %ebx
cfi_restore (3)
/* %eax is
cmpl $-125, %eax
jae SYSCALL_ERROR_LABEL
/* Successful; return the syscall's value. */
L(pseudo_end):
ret
注意上面所用的汇编代码采用的是AT&T格式(通常学校所教的是Intel汇编),这是Linux中对x86体系常用的汇编格式。glibc中一般直接采用这种汇编代码来进入内核访问系统调用,而不是_syscalln()格式的宏。
上面代码的作用是进入内核来访问名为socketcall的系统调用,在内核代码中,socketcall系统调用的对应代码在net/socket.c文件中。下面的代码取自Linux内核版本2.26.11:
asmlinkage long sys_socketcall(int call, unsigned long __user *args)
{
unsigned long a[6];
unsigned long a0,a1;
int err;
if(call<1
------解决思路----------------------
call>SYS_RECVMSG)
return -EINVAL;
/* copy_from_user should be SMP safe. */
if (copy_from_user(a, args, nargs[call]))
return -EFAULT;
a0=a[0];
a1=a[1];
switch(call)
{
case SYS_SOCKET:
err = sys_socket(a0,a1,a[2]);
break;
case SYS_BIND:
err = sys_bind(a0,(struct sockaddr __user *)a1, a[2]);
break;
case SYS_CONNECT:
err = sys_connect(a0, (struct sockaddr __user *)a1, a[2]);
break;
case SYS_LISTEN:
err = sys_listen(a0,a1);
break;
case SYS_ACCEPT:
err = sys_accept(a0,(struct sockaddr __user *)a1, (int __user *)a[2]);
break;
case SYS_GETSOCKNAME:
err = sys_getsockname(a0,(struct sockaddr __user *)a1, (int __user *)a[2]);
break;
case SYS_GETPEERNAME:
err = sys_getpeername(a0, (struct sockaddr __user *)a1, (int __user *)a[2]);
break;
case SYS_SOCKETPAIR:
err = sys_socketpair(a0,a1, a[2], (int __user *)a[3]);
break;
case SYS_SEND:
err = sys_send(a0, (void __user *)a1, a[2], a[3]);
break;
case SYS_SENDTO:
err = sys_sendto(a0,(void __user *)a1, a[2], a[3],
(struct sockaddr __user *)a[4], a[5]);
break;
case SYS_RECV:
err = sys_recv(a0, (void __user *)a1, a[2], a[3]);
break;
case SYS_RECVFROM:
err = sys_recvfrom(a0, (void __user *)a1, a[2], a[3],
(struct sockaddr __user *)a[4], (int __user *)a[5]);
break;
case SYS_SHUTDOWN:
err = sys_shutdown(a0,a1);
break;
case SYS_SETSOCKOPT:
err = sys_setsockopt(a0, a1, a[2], (char __user *)a[3], a[4]);
break;
case SYS_GETSOCKOPT:
err = sys_getsockopt(a0, a1, a[2], (char __user *)a[3], (int __user *)a[4]);
break;
case SYS_SENDMSG:
err = sys_sendmsg(a0, (struct msghdr __user *) a1, a[2]);
break;
case SYS_RECVMSG:
err = sys_recvmsg(a0, (struct msghdr __user *) a1, a[2]);
break;
default:
err = -EINVAL;
break;
}
return err;
}
上面的switch/case对应前面socket函数组中的各个函数。这样对于用户空间的一组socket函数,实际上只用到了socketcall一个系统调用,通过不同的参数来进行区分,而进入内核中的实现则可发现,对于不同的参数,由switch/case中不同的case再分别进入不同的内核函数。
文章评论
linux下的socket在哪个头文件,socket函数在哪个文件定义,解决方案相关推荐
- VSCODE编译头文件时函数没有定义的解决方案(VSCODE手动链接C文件方法)
VSCODE编译头文件时函数没有定义的解决方案(VSCODE手动链接C文件方法) 参考文章: (1)VSCODE编译头文件时函数没有定义的解决方案(VSCODE手动链接C文件方法) (2)https: ...
- Linux下使用gcc时conio头文件问题
1.当在linux下使用gcc编译一个.c文件时,出现下图错误 我使用gcc编译一个bank.c文件,报错显示conio头文件找不到. 2.这是因为conio是一个非标准库,适用于老的DOS系统,在W ...
- Linux下gcc编译中关于头文件与库文件搜索路径相关问题
如何指定GCC的默认头文件路径 网上偶搜得之,以之为宝:) 原地址:http://blog.chinaunix.net/u/28781/showart.php?id=401631 ========== ...
- Linux下C语言的系统头文件
Linux菜鸟初看Linux下编程的糗事. 前段时间琢磨着接触一下Linux下的C语言编程,就找了本书看.看到很多文件操作的程序要包含"sys/stat.h". 写程序前,我想先找 ...
- linux下mkdir头文件_整理Linux下gcc编译中关于头文件与库文件搜索路径相关问题
态库./libpos.so. /root/test/env/lib/libpos.so和/root/test/conf/lib/libpos.so.我们再用源程序 pos_lib.c(见程序5)来创建 ...
- linux下找不到sqlite3头文件,关于CentOS 7下sqlite3找不到的问题解决
本文主要给大家介绍的关于CentOS 7下sqlite3找不到问题的解决方法,分享出来供大家参考学习,下面来一起看看详细的介绍: Centos7下的nltk启动问题 CentOS 7, Python ...
- linux文件系统添加pcm,linux下用sox批量将pcm文件加wav头、批量修改采样率、切音频...
linux下用sox可以给pcm文件加头 例如:test.pcm是不带wav头的pcm文件 $ sox -t raw -c 1 -e signed-integer -b 16 -r 16000 tes ...
- linux下c语言使用mac地址进行socket通信
linux下c语言使用mac地址进行socket通信 server端: #include <unistd.h> #include <stdio.h> #include < ...
- Linux下使用C++播放wav音频文件
Linux下使用C++播放wav音频文件 安装openal第三方库 上代码 安装openal第三方库 unbuntu下安装命令:sudo apt-get install libopenal-dev 安 ...
最新文章
- Word2Vec 使用总结
- 【译】Typescript的类型(二)
- Mongodb数据库连接
- r语言教程w3c,R语言 数据库
- C++的extern关键字
- JavaSE——类集(上)(Collection、List、Iterator、forEach)
- iFit—Smart Cardio Equipment 简介与下载
- C++程序设计选择题
- 泰山游记:拱北石与八仙过海电视剧
- UNIX网络编程---守护进程和inetd超级服务器(十三)
- 一个关于容抗与感抗的实验
- 异步获取到图虫上的图片
- GNUradio与USRP折腾指南
- 《UNIX编程艺术》精彩语录
- 【PS基础教程】PS制作圆形小图标
- asp毕业设计——基于Delphi+udp+UDP的基于局域网的信息收发系统设计与实现(毕业论文+程序源码)——信息收发系统
- 信息学奥林匹克c语言提高组,信息学奥赛提高组一级全攻略!你值得拥有!
- 【第十三届全国大学生数学竞赛非数学类】真就参加就有奖
- 自动加域脚本,bat和vbs配合使用,使加域操作更简单
- b关于bootstrap官网https://v4.bootcss.com/docs/layout/grid/关于栅格布局的学习和实践博客