【发布时间】:2013-07-24 14:04:43
【问题描述】:
我想用我的程序设置一些本地 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 运行,所以我认为我不应该有访问权限问题。
我在树莓派上运行 Debian GNU/Linux 7.0 (wheezy)。
【问题讨论】:
-
引用我的手册页:“Glibc 没有为这个系统调用提供包装器;使用
syscall(2)调用它。或者更确切地说......不要调用它:长期以来一直不鼓励使用这个系统调用,它非常不受欢迎,很可能在未来的内核版本中消失。从 Linux 2.6.24 开始,使用这个系统调用会导致内核日志中出现警告。从你的现在程序;改用 /proc/sys 接口。这个系统调用只有在内核配置了 CONFIG_SYSCTL_SYSCALL 选项时才可用。" -
谢谢!错过这个感觉很傻,但我很高兴我现在知道了。