errno:38(函数未实现)用于更改sysctl值的调用
我想用我的程序设置一些本地sysctl参数,我遵循了这里给出的说明: 例如,下面是我为errno:38(函数未实现)用于更改sysctl值的调用,c,linux,ipv6,errno,sysctl,C,Linux,Ipv6,Errno,Sysctl,我想用我的程序设置一些本地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\u iIndex,//此iIndex来自上面配置的接口 NE
/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\u iIndex,//此iIndex来自上面配置的接口
NET_IPV6_ACCEPT_RA};
int tun0_accept_ra_value=0;
如果(sysctl(tun0\u accept\u ra\u路径,
帕斯伦,
无效的
0,
&tun0_接受_ra_值,
sizeof(tun0\u接受值))<0){
printf(“设置sysctl'accept\u ra'失败。错误号:%d\n”,错误号);
}
我得到:set sysctl'accept\u ra'失败。错误号:38未实现功能
有没有想过会有什么问题?我以sudo的身份运行,所以我认为我不应该有访问权限问题
我正在树莓pi上运行Debian GNU/Linux 7.0(wheezy)。您使用的教程太旧了!如果您想要此系统调用的参考,请查看以下链接: 由于sysctl不存在,因此会出现SIGSYS错误。该系统的正确名称为*\u syscall*,glibc不提供包装器,因为不应调用该系统调用(它将从下一个Linux版本中删除)。您可以使用/proc接口实现相同的结果 如果您想保留您的解决方案,您应该按如下方式更改代码(对不起,我尚未测试):
#包括
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;
如果(系统调用),
tun0_接受_ra_路径,
帕斯伦,
无效的
0,
&tun0_接受_ra_值,
sizeof(tun0\u接受值))<0){
printf(“设置sysctl'accept\u ra'失败。错误号:%d\n”,错误号);
}
更好的解决方案可能是:
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);
int tun0\u accept\u ra\u value=0;
如果((fd=open(“/proc/sys/net/ipv6/conf/tun0/accept_-ra”,O_-RDWR))<0)
佩罗(“公开”);
if(写入(fd,&tun0_接受_ra_值,sizeof(int))<0)
佩罗(“书面”);
关闭(fd);
我希望我是有用的 您使用的教程太旧了!如果您想要此系统调用的参考,请查看以下链接: 由于sysctl不存在,因此会出现SIGSYS错误。该系统的正确名称为*\u syscall*,glibc不提供包装器,因为不应调用该系统调用(它将从下一个Linux版本中删除)。您可以使用/proc接口实现相同的结果 如果您想保留您的解决方案,您应该按如下方式更改代码(对不起,我尚未测试):
#包括
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;
如果(系统调用),
tun0_接受_ra_路径,
帕斯伦,
无效的
0,
&tun0_接受_ra_值,
sizeof(tun0\u接受值))<0){
printf(“设置sysctl'accept\u ra'失败。错误号:%d\n”,错误号);
}
更好的解决方案可能是:
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);
int tun0\u accept\u ra\u value=0;
如果((fd=open(“/proc/sys/net/ipv6/conf/tun0/accept_-ra”,O_-RDWR))<0)
佩罗(“公开”);
if(写入(fd,&tun0_接受_ra_值,sizeof(int))<0)
佩罗(“书面”);
关闭(fd);
我希望我是有用的 引用我的手册页:“Glibc没有为这个系统调用提供包装器;使用
syscall(2)调用它
。或者更确切地说……不要调用它:长期以来,不鼓励使用此系统调用,而且它非常不受欢迎,可能会在将来的内核版本中消失。自Linux 2.6.24以来,使用此系统调用会导致内核日志中出现警告。现在将其从程序中删除;改为使用/proc/sys接口。此sys只有在内核配置了CONFIG\u SYSCTL\u SYSCALL选项时,tem调用才可用!我觉得错过这个很傻,但我很高兴我现在已经知道了。引用我的手册页:“Glibc没有为这个系统调用提供包装;使用syscall(2)调用它
。或者更确切地说……不要调用它:长期以来,不鼓励使用此系统调用,而且它非常不受欢迎,可能会在将来的内核版本中消失。自Linux 2.6.24以来,使用此系统调用会导致内核日志中出现警告。现在将其从程序中删除;改为使用/proc/sys接口。此sys只有在内核配置了CONFIG\u SYSCTL\u SYSCALL选项时,tem调用才可用!错过这个让我觉得很傻,但我很高兴我现在知道了。非常感谢!我应该检查一下不鼓励使用这个系统调用。我现在只是直接向文件中写入,这很好。我可能也会使用上面的O_TRUNC标志来确保写得过多。非常感谢!我应该检查一下不鼓励使用这个系统调用。我现在只是直接向文件中写入,这很好。我可能还会在上面使用O_TRUNC标志来确保写得过多。
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);