한동안 검색을 해봤지만 같은 문제를 찾을 수 있는 명확한 키워드가 없습니다.
내 문제에 대한 간략한 설명:
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
}
인용하다: