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

Suv*_*apa 1 c linux errno ipv6 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);
}
Run Code Online (Sandbox Code Playgroud)

我明白了: set sysctl 'accept_ra' failed. errno: 38 Function not implemented

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

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

Giu*_*Pes 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);
}
Run Code Online (Sandbox Code Playgroud)

更好的解决方案可能是:

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); 
Run Code Online (Sandbox Code Playgroud)

我希望我有用.