我想在程序中设置一些本地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)。
答案 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);
我希望自己有用。