当前位置:我的异常网» 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函数在哪个文件定义,解决方案相关推荐

  1. VSCODE编译头文件时函数没有定义的解决方案(VSCODE手动链接C文件方法)

    VSCODE编译头文件时函数没有定义的解决方案(VSCODE手动链接C文件方法) 参考文章: (1)VSCODE编译头文件时函数没有定义的解决方案(VSCODE手动链接C文件方法) (2)https: ...

  2. Linux下使用gcc时conio头文件问题

    1.当在linux下使用gcc编译一个.c文件时,出现下图错误 我使用gcc编译一个bank.c文件,报错显示conio头文件找不到. 2.这是因为conio是一个非标准库,适用于老的DOS系统,在W ...

  3. Linux下gcc编译中关于头文件与库文件搜索路径相关问题

    如何指定GCC的默认头文件路径 网上偶搜得之,以之为宝:) 原地址:http://blog.chinaunix.net/u/28781/showart.php?id=401631 ========== ...

  4. Linux下C语言的系统头文件

    Linux菜鸟初看Linux下编程的糗事. 前段时间琢磨着接触一下Linux下的C语言编程,就找了本书看.看到很多文件操作的程序要包含"sys/stat.h". 写程序前,我想先找 ...

  5. linux下mkdir头文件_整理Linux下gcc编译中关于头文件与库文件搜索路径相关问题

    态库./libpos.so. /root/test/env/lib/libpos.so和/root/test/conf/lib/libpos.so.我们再用源程序 pos_lib.c(见程序5)来创建 ...

  6. linux下找不到sqlite3头文件,关于CentOS 7下sqlite3找不到的问题解决

    本文主要给大家介绍的关于CentOS 7下sqlite3找不到问题的解决方法,分享出来供大家参考学习,下面来一起看看详细的介绍: Centos7下的nltk启动问题 CentOS 7, Python ...

  7. 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 ...

  8. linux下c语言使用mac地址进行socket通信

    linux下c语言使用mac地址进行socket通信 server端: #include <unistd.h> #include <stdio.h> #include < ...

  9. Linux下使用C++播放wav音频文件

    Linux下使用C++播放wav音频文件 安装openal第三方库 上代码 安装openal第三方库 unbuntu下安装命令:sudo apt-get install libopenal-dev 安 ...

最新文章

  1. Word2Vec 使用总结
  2. 【译】Typescript的类型(二)
  3. Mongodb数据库连接
  4. r语言教程w3c,R语言 数据库
  5. C++的extern关键字
  6. JavaSE——类集(上)(Collection、List、Iterator、forEach)
  7. iFit—Smart Cardio Equipment 简介与下载
  8. C++程序设计选择题
  9. 泰山游记:拱北石与八仙过海电视剧
  10. UNIX网络编程---守护进程和inetd超级服务器(十三)
  11. 一个关于容抗与感抗的实验
  12. 异步获取到图虫上的图片
  13. GNUradio与USRP折腾指南
  14. 《UNIX编程艺术》精彩语录
  15. 【PS基础教程】PS制作圆形小图标
  16. asp毕业设计——基于Delphi+udp+UDP的基于局域网的信息收发系统设计与实现(毕业论文+程序源码)——信息收发系统
  17. 信息学奥林匹克c语言提高组,信息学奥赛提高组一级全攻略!你值得拥有!
  18. 【第十三届全国大学生数学竞赛非数学类】真就参加就有奖
  19. 自动加域脚本,bat和vbs配合使用,使加域操作更简单
  20. b关于bootstrap官网https://v4.bootcss.com/docs/layout/grid/关于栅格布局的学习和实践博客

热门文章

  1. LOESS(局部加权回归)
  2. 异步加载和加载进度条
  3. 戒手机瘾神器?看这篇就够了
  4. 办公自动需要有计算机硬件化,[计算机硬件及网络]办公自动化设备第3章.ppt
  5. 优秀硬盘分区管理工具--Partition Magic V8.0
  6. 【数据库】LDAP 的概念与 Spring LDAP 框架使用
  7. IDEA import导入的类明明存在,却飘红?
  8. LAN offload 功能
  9. [cdq分治习题练习]
  10. Kafka 原理详解