是否有API调用为Linux禁用网络

Is there an API call to disable the network for Linux?

本文关键字:网络 Linux API 调用 是否      更新时间:2023-10-16

我在运行Red Had Enterprise Linux的实时系统上维护代码。我担心有时,尽管以最高优先级运行,但网络还是会使计算机速度减慢,我想禁用卡,这样我就可以使用CPU的全部功率。在我的功能开始时,我需要一些来自网络的文件,但在某一点之后,我可以有效地禁用网络,直到程序完成。有没有办法通过某种API调用禁用网络?

希望有人能对此进行扩展,但研究ifconfig如何禁用网络设备可能是值得的。你可能可以在接口上做一个ioctl来禁用它。根据驱动程序/nic的不同,内核可能会导致网络硬件丢弃数据包,而不是cpu。

ifconfig的源代码如下:

http://net-tools.git.sourceforge.net/git/gitweb.cgi?p=net-工具/网络工具;a=斑点;f=ifconfig.c;h=be6999578bd81e91e90e26a35fad91f4928f4226;hb=头

Iproute2也可以做与ifconfig相同的事情,如下所述:

http://git.kernel.org/?p=linux/kernel/git/shemminger/iproute2.git;a=斑点;f=ip/学科.c;h=6b051b65faab72ea46534ad3f71b3f6cd35c11b;hb=封头#l589

我发现iproute2的源代码比ifconfig更容易理解,但应该更容易看到它们如何与网络堆栈接口以禁用接口。

系统执行此操作的方式是发出ip link set dev ${DEVICE} down 2> null。看看ip.c的代码,例如,在这里你可以自己检查它是如何完成的。关键是netif.h,它通过调用net_if_set_down()来关闭网络。我认为这只是树立了一面旗帜。

netif->flags &= ~NETIF_FLAG_UP

你可以自己从这里继续,但请记住netif.h是内核的一部分。。。

网络是内核的一部分,而不是用户空间进程。您可以执行相当于调用rmmod从内核中删除网络驱动程序模块的操作,假设您启用了模块支持;或者您可以将所有的netfilter规则设置为DROP,看看这是否会加快速度。我可能更喜欢在启动器脚本中(使用现成的iptables-save/iptables-restore)这样做,而不是用C++进行编码。或者,您甚至可以直接关闭接口。

您说了"API",但没有提到程序/脚本的语言,也没有提到操作系统。

在Linux变体上,如CentOS、RHEL、SuSE和Fedora,来自bash/Bourne shell脚本:

/sbin/service network stop
rc=$?
if [ "$rc" -ne 0 ]; then
    echo "***** Failed to stop networking service"
    exit $rc
fi
# Do your thing
/sbin/service network start