Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
errno:38(函数未实现)用于更改sysctl值的调用_C_Linux_Ipv6_Errno_Sysctl - Fatal编程技术网

errno:38(函数未实现)用于更改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

我想用我的程序设置一些本地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来自上面配置的接口
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);