しばらく検索してみましたが、同じ問題を見つけるための明確なキーワードはありません。
私の問題の簡単な説明:
ifconfig
有効なNICのみが表示されます。
# ifconfig
br0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
...
eth0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
inet addr:XX.XX.XX.XX Bcast:XX.XX.XX.XX Mask:XX.XX.XX.XX
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
...
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
...
ただし、ip addr
すべてのNICが表示されます。
# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> ... UNKNOWN
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> ... state UP
3: eth1: <BROADCAST,MULTICAST> ... state DOWN
8: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> ... state UNKNOWN
画面出力に基づいて、文字ifconfig
列を介してネットワークカードが有効になっているかどうかを確認できます。戻る。 (例:ループバック、戻る、LOWER_UP)
私が知る限り、この文字列はハードウェアとは何の関係もありません。したがって、どちらも答えでは/sys/class/net/NIC/operstate
ありません。/sys/class/net/NIC/carrier
私の質問は:そのロープはどこから来ますか?
(ファイルシステムの一部のファイルに含まれていると推測します。)
答え1
man ifconfig
説明する:
ifconfig はカーネル常駐ネットワークインタフェースを設定するために使用されます。必要に応じてインターフェイスを設定するために起動時に使用されます。それ以降は通常、デバッグ時やシステム調整が必要な場合にのみ必要です。
引数が指定されていない場合、ifconfig は現在アクティブなインターフェイスのステータスを表示します。
単一のインターフェースパラメーターが指定されている場合は、そのインターフェースの状況のみが表示されます。
単一の-a引数が指定されている場合は、停止したインターフェイスを含むすべてのインターフェイスのステータスが表示されます。
それ以外の場合はインターフェイスを設定します。
man netdevice
また、この問題に関するいくつかの手がかりを共有することもできます。 ioctl() システムコールを使用します。
もう一つの技術はを使用することですstrace
。
これは、渡されたプログラムによって実行されたすべてのシステム呼び出しのリストと、対応する引数と戻り値を提供します。プログラムが長時間実行されるのではなく、一部の情報をダンプして終了する場合は、検索中の情報を提供できるように見えるすべてのシステム呼び出しに対してmanを実行するのは非常に簡単です。
私が走るとき
strace ifconfig
いくつかの興味深い呼び出しは次のとおりです。
open("/proc/net/dev", O_RDONLY) = 6
以下はioctlの束です。
ioctl(5, SIOCGIFFLAGS, {ifr_name="eth0", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0
ioctl(5, SIOCGIFHWADDR, {ifr_name="eth0", ifr_hwaddr=12:cd:4b:bb:7f:39}) = 0
ioctl(5, SIOCGIFMETRIC, {ifr_name="eth0", ifr_metric=0}) = 0
ioctl(5, SIOCGIFMTU, {ifr_name="eth0", ifr_mtu=9001}) = 0
答え2
助けてくれてありがとう。これは私のテストコードです。
check_ifup.c
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
int main(int argc, char* argv[])
{
if (argc < 2)
{
printf("Usage: ./check_ifup interface_name\n");
return 0;
}
struct ifreq ifr;
int sockfd;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
bzero(&ifr, sizeof(ifr));
strcpy(ifr.ifr_name, argv[1]);
ioctl(sockfd, SIOCGIFFLAGS, &ifr);
if (ifr.ifr_flags & IFF_UP)
printf("%s is up\n", argv[1]);
else
printf("%s is down or unknown\n", argv[1]);
close(sockfd);
return 0
}
引用: