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).
您使用的教程太旧了!如果你想要这个系统调用的参考,你应该看看这个链接: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)
我希望我有用.
| 归档时间: |
|
| 查看次数: |
6284 次 |
| 最近记录: |