免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4601 | 回复: 9
打印 上一主题 下一主题

[函数] 请教:lib库函数怎么调用内核函数的。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-16 09:07 |只看该作者 |倒序浏览

  1. int
  2. __connect (fd, addr, len)
  3.      int fd;
  4.      __CONST_SOCKADDR_ARG addr;
  5.      socklen_t len;
  6. {
  7.   __set_errno (ENOSYS);
  8.   return -1;
  9. }
  10. weak_alias (__connect, connect)

复制代码

以上是libc库中connect.c文件关于connect 的函数实现。


可我不明白这个函数除了设置错误代码并返回-1外,什么都没做。这样应用程序在调用connect 是岂不是没做syn的发送吗 ?
那位高手指点一下

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2006-08-16 10:44 |只看该作者
你没找对地方。
肯定不是这里。

论坛徽章:
0
3 [报告]
发表于 2006-08-16 17:37 |只看该作者
int
__connect (fd, addr, len)
     int fd;
     __CONST_SOCKADDR_ARG addr;
     socklen_t len;
{
  __set_errno (ENOSYS);
  return -1;
}
weak_alias (__connect, connect)

不知道你看的是什么库的实现,或者找到的是哪一部分。你贴出来这部分的调用,直接返回ENOSYS。
一般unix/linux下面,x86的CPU上,系统调用都是实现为一个软中断, 好像是int 80, EAX填系统调用号

论坛徽章:
0
4 [报告]
发表于 2006-08-17 00:14 |只看该作者
我以前也浏览到这个地方,我找不到别的定义.后来也就不找了
系统调用一般都是汇编写好的吧,系统调用的处理代码会处理内核的返回值,并且根据它去设置errno

论坛徽章:
0
5 [报告]
发表于 2006-08-17 00:29 |只看该作者
Linux的话,
  1. int 0x80
复制代码

论坛徽章:
0
6 [报告]
发表于 2006-08-17 01:04 |只看该作者
原帖由 JohnBull 于 2006-8-17 00:29 发表
Linux的话,
  1. int 0x80
复制代码

LZ就是想知道这个int 0x80在哪
我一直没有找到libc系统调用定义的地方

论坛徽章:
0
7 [报告]
发表于 2006-08-17 04:37 |只看该作者
weak_alias 这种 ld 魔法……
Glibc 的源码是出奇难懂的东西。

论坛徽章:
0
8 [报告]
发表于 2006-08-17 14:45 |只看该作者
找到glibc-2.4/sysdeps/mach/hurd/conenct.c文件

  1. int
  2. __connect (int fd, __CONST_SOCKADDR_ARG addrarg, socklen_t len)
  3. {
  4.   error_t err;
  5.   addr_port_t aport;
  6.   const struct sockaddr_un *addr = addrarg.__sockaddr_un__;

  7.   if (addr->sun_family == AF_LOCAL)
  8.     {
  9.       /* For the local domain, we must look up the name as a file and talk
  10.          to it with the ifsock protocol.  */
  11.       file_t file = __file_name_lookup (addr->sun_path, 0, 0);
  12.       if (file == MACH_PORT_NULL)
  13.         return -1;
  14.       err = __ifsock_getsockaddr (file, &aport);
  15.       __mach_port_deallocate (__mach_task_self (), file);
  16.       if (err == MIG_BAD_ID || err == EOPNOTSUPP)
  17.         /* The file did not grok the ifsock protocol.  */
  18.         err = ENOTSOCK;
  19.       if (err)
  20.         return __hurd_fail (err);
  21.     }
  22.   else
  23.     err = EIEIO;

  24.   err = HURD_DPORT_USE (fd,
  25.                         ({
  26.                           if (err)
  27.                             err = __socket_create_address (port,
  28.                                                            addr->sun_family,
  29.                                                            (char *) addr, len,
  30.                                                            &aport);
  31.                           if (! err)
  32.                             {
  33.                               err = __socket_connect (port, aport);
  34.                               __mach_port_deallocate (__mach_task_self (),
  35.                                                       aport);
  36.                             }
  37.                           err;
  38.                         }));

  39.   return err ? __hurd_dfail (fd, err) : 0;
  40. }
复制代码

可__socket_create_address函数  __socket_connect 函数就找不到,郁闷,查了内核代码,也没找到。

论坛徽章:
0
9 [报告]
发表于 2006-08-17 14:52 |只看该作者
原想通过了解库函数connect的实现为切入点,来进一步学习内核都做了些什么的。希望能得到大家的帮助。

论坛徽章:
0
10 [报告]
发表于 2006-08-17 15:24 |只看该作者
去找connect的实现
这只是weak_alias,在connect没有实现的时候会把connect链接到这个函数。
找个利索点的C库看吧.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP