errno:38(函数未实现)调用更改sysctl值

时间:2013-07-24 21:29:41

标签: c linux ipv6 errno sysctl

我想在程序中设置一些本地sysctl参数,然后按照此处给出的说明进行操作:http://www.linux.it/~rubini/docs/sysctl/

举个例子,这就是我为/proc/sys/net/ipv6/conf/tun0/accept_ra设置值所做的工作。我刚刚在此调用之前配置了tun0接口。 (我验证我的界面已启动,我也可以分配IP地址)

int path_len = 5;
int tun0_accept_ra_path[] =  { CTL_NET,
                               NET_IPV6,
                               NET_IPV6_CONF,
                               ifr6.ifr6_ifindex, // This ifindex comes from an interface configured above
                               NET_IPV6_ACCEPT_RA };
int tun0_accept_ra_value = 0;
if (sysctl(tun0_accept_ra_path,
           path_len,
           NULL,
           0,
           &tun0_accept_ra_value,
           sizeof(tun0_accept_ra_value)) < 0) {
  printf("set sysctl 'accept_ra' failed. errno: %d\n", errno);
}

我得到:set sysctl 'accept_ra' failed. errno: 38 Function not implemented

有什么可能出错的想法?我正在以sudo身份运行,因此我认为我不应该有访问权限问题。

我正在使用覆盆子pi运行Debian GNU / Linux 7.0(wheezy)。

1 个答案:

答案 0 :(得分:6)

您使用的教程太旧了!如果您需要此系统调用的参考,请查看以下链接:http://man7.org/linux/man-pages/man2/sysctl.2.html

您收到 SIGSYS 错误,因为sysctl不存在。该系统的正确名称是* _syscall *,并且glibc不提供包装器,因为不应该调用此系统调用(它将从下一个Linux版本中删除)。您可以使用 / proc 接口获得相同的结果。

如果你想保留你的解决方案,你应该按如下方式更改代码(我没有测试过,抱歉):

#include <sys/syscall.h> 

int path_len = 5;
int tun0_accept_ra_path[] =  { CTL_NET,
                               NET_IPV6,
                               NET_IPV6_CONF,
                               ifr6.ifr6_ifindex, 
                               NET_IPV6_ACCEPT_RA };
int tun0_accept_ra_value = 0;
if (syscall(__NR_sysctl, 
           tun0_accept_ra_path,
           path_len,
           NULL,
           0,
           &tun0_accept_ra_value,
           sizeof(tun0_accept_ra_value)) < 0) {
  printf("set sysctl 'accept_ra' failed. errno: %d\n", errno);
}

更好的解决方案可能是:

int tun0_accept_ra_value = 0;

if ((fd=open("/proc/sys/net/ipv6/conf/tun0/accept_ra", O_RDWR)) < 0) 
   perror("OPEN"); 

if (write (fd, &tun0_accept_ra_value, sizeof(int)) < 0)
   perror("WRITE"); 

close(fd); 

我希望自己有用。