【问题标题】:how to know if the Linux os i am using has the specific system calls?如何知道我使用的 Linux 操作系统是否有特定的系统调用?
【发布时间】:2018-04-03 06:54:38
【问题描述】:

我正在为一个繁忙的盒子构建一个固件应用程序。我的应用程序使用了所有与套接字相关的系统调用,但是当我运行程序时,即使服务器端口打开,客户端也无法连接到服务器(使用 netstat -nl 检查)。

如果我正在使用的系统调用在操作系统上启用,是否可以检查忙框?

更新:连接到服务器套接字的程序在设备 1 上运行,而同一程序在设备 2 上不运行。 device2 对内核进行了更新,这就是我在考虑是否不支持某些系统调用的原因。

在连接系统调用后给出的错误是 errno - 97。这是不支持的协议族。

我观察到问题是由下面的代码部分引起的。

ADDRINFOA 提示; PADDRINFOA 结果;

hints.ai_family = AF_INET;

if (getaddrinfo (hostname, NULL, &hints, &result) == 0)

{

memcpy (sockaddr, result->ai_addr, result->ai_addrlen);

freeaddrinfo (result);

}

在 Getaddrinfo 之后,sockaddr.ss_family 为 0。我希望为 2

我在这里做错了什么?有什么帮助吗?

【问题讨论】:

  • 首先,请不要使用多语言标签。仅使用您实际编程的语言。其次,请read about how to ask good questions 并学习如何创建Minimal, Complete, and Verifiable Example。最后,尝试连接时遇到什么错误?您确实检查了connect 调用给您带来了什么错误?
  • 没有禁用系统调用这样的事情。您系统上的某些功能可能会被 SELinux 安全系统阻止,但它不会禁用系统调用,它会根据安全上下文阻止某些 I/O 操作。您的问题是 X/Y 问题的示例。你必须诊断为什么你没有得到连接。你有防火墙吗?调用返回什么错误代码?您可以 ping、traceroute 到目的地吗?
  • 感谢“一些编程老兄”的投入,感谢您不投反对票。我正在删除这个问题,因为我发现我的问题是由于连接期间出现了一些套接字错误(errno 97 - 不支持地址系列)。我将发布一个单独的格式良好的问题。
  • @Swift - 将内核配置为没有特定的系统调用(例如CONFIG_NETWORK=n)可能算作“禁用”它们。
  • 在运行时检查它的方法是运行一个执行系统调用的程序,看看调用是否失败并将errno设置为ENOSYS。 (现在 - 如果您的服务器正在运行并在某个端口上侦听,那么您可能在其他地方遇到问题,例如尝试使用内核不支持的协议,或者防火墙或路由问题 - 而不是缺少系统调用)

标签: c++ c linux-kernel network-programming busybox


【解决方案1】:

如果您没有在不常见的配置中编译内核,则应该包含所有网络功能(这意味着应该包含与网络相关的系统调用)

发布您的失败代码可能是一个想法,已经在 cmets 中发出信号(关注 @SomeProgrammerDude 的评论)

编辑

系统调用使用固定的、已注册的标识符(内部整数 id)来选择正确的系统调用,这必须与不同的内核和不同的标准库一起工作,这些标准库绑定了我们知道系统调用的标识符名称。如果修改其中任何一个,就会破坏 stdlib 接口(或内核),因此它们是固定的。即使没有实现功能,系统调用入口点也必须工作。通常,在未实际实现的系统调用上,有一个存根函数限制在调用时给出错误。

【讨论】:

  • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
  • 是的,它提供了它。但这不是人们想听到的。系统调用集在运行时不可更新(基于加载模块或卸载模块),因此它们都包含在正在运行的内核中(可能带有存根实现,尝试时会出错)。
  • 这个问题应该被投票赞成关闭,因为OP根本没有发布任何代码,因此无法进行诊断,只能推测他可以做什么。每个构建的内核都包含系统调用(甚至是非工作调用)。不存在系统调用的唯一可能性是编辑源代码并消除它。
  • 你的答案的第一部分是猜测,不适合答案。第二部分虽然是事实,但没有回答问题。
猜你喜欢
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多