gpt4 book ai didi

c - errno: 38 (Function not implemented) 在调用更改 sysctl 值时

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:24:04 24 4
gpt4 key购买 nike

我想在我的程序中设置一些本地 sysctl 参数,我按照此处给出的说明进行操作:http://www.linux.it/~rubini/docs/sysctl/

例如,这是我为 /proc/sys/net/ipv6/conf/tun0/accept_ra 设置值的操作。我刚刚在这次调用之前配置了我的 tun0 接口(interface)。 (我验证了我的接口(interface)已启动并且我也能够分配 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' 失败。 errno: 38 函数未实现

有什么想法是错误的吗?我以 sudo 身份运行,所以我认为我不应该有访问权限问题。

我在树莓派上运行 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);
}

更好的解决方案可能是:

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);

希望对您有所帮助。

关于c - errno: 38 (Function not implemented) 在调用更改 sysctl 值时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17845152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com