转换`ip tuntap add` system()调用C代码

时间:2018-04-01 23:02:43

标签: c linux tun-tap

我尝试将我在C中调用system()来调用ip tuntap add ...来调用不依赖于system()调用的C代码。

基本上,当我的应用程序被强制终止时,我使用system("ip tuntap add ...")调用启动的隧道适配器留在那里是一个问题。

我被告知我可以使用rtnetlink来实现我的目标。我想将以下行转换为不依赖于system()调用的C代码。我相信如果我使用rtnetlink,当我的应用程序终止时,我提出的隧道适配器会被内核破坏,这是我想要这样做的主要原因。

这是我在C中的当前行:

system("ip tuntap add dev tun1 mode tun");

如果rtnetlink不是我要怎么做的话,还有另一种方法会在我的申请被强行终止时破坏隧道吗?

1 个答案:

答案 0 :(得分:3)

@ Jonathon Reinhart在评论中回答了这个问题:

您正在寻找的是非持久性TUN适配器。而不是使用

system("ip tuntap add dev tun1 mode tun");

查看此文件中的tun_alloc函数:simpletun.c

您可以将其称为:

int tun_fd = tun_alloc("tun1", IFF_TUN | IFF_NO_PI);

当它被调用时,如果它不存在则会创建新隧道并返回隧道的文件描述符。如果它已经存在,它将只返回隧道的文件描述符。

当它创建隧道时,如果您的进程终止,它将主动销毁隧道和任何相关路由。