iostat/netstat/sar

TAEWOO HA·2023년 6월 18일
0

프로젝트 #2

목록 보기
2/8

iostats

  • 간단한 디스크에 관한 통계를 보여주는 명령어.

  • Disk I/O는 시스템에서 가장 느린 리소스 중 하나

  • /proc/diskstats

#include <stdio.h>
#include <stdlib.h>

#define DISK_NAME "mmcblk0"

int main(){
        FILE* diskstats_file;
        char line[256];
        char disk_name[32];
        unsigned long sectors_read =0, sectors_written = 0, sectors_discard = 0;

        diskstats_file = fopen("/proc/diskstats", "r");
        if (diskstats_file == NULL){
                perror("Failed to open /proc/diskstats");
                exit(-1);
        }

        while(fgets(line, sizeof(line), diskstats_file)) {

                unsigned long temp_sectors_read, temp_sectors_written, temp_sectors_discard;

                //형식에 맞게 문자열을 파싱.
                sscanf(line, "%*d %*d %s %*d %*d %lu %*d %*d %*d %lu %*d %*d %*d %*d %lu",
                        disk_name, &temp_sectors_read, &temp_sectors_written, &temp_sectors_discard);

                if (strcmp(disk_name, DISK_NAME) == 0){
                        sectors_read = temp_sectors_read;
                        sectors_written = temp_sectors_written;
                        sectors_discard = temp_sectors_discard;
                        break;
                }
        }

        fclose(diskstats_file);

        printf("Sectors read (KB): %lu\n", sectors_read/2);
        printf("Sectors written (KB): %lu\n", sectors_written/2);
        printf("Sectors discard (KB): %lu\n", sectors_discard/2);

        return 0;
}

netstat

  • 다음과 같이 결과가 나오게 하기

  • /proc/net/tcp 가져오기

  • 리틀 엔디안으로 이루어진 IP주소/ 포트번호를 빅 엔디안(192.168.x.x)로 표시되도록 한다.

코드 - 16진수 => 10진수 변환 전

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define DISK_NAME "netstat"
#define STATE_LENGTH 10


int main(){
        FILE* netstat; //
        char line[256];
        char state[STATE_LENGTH];
        unsigned int  local_address = 0, port = 0 ;

        netstat = fopen("/proc/net/tcp", "r");
        if (netstat == NULL){
                perror("Failed to open /proc/net/tcp");
                exit(-1);
        }

        while(fgets(line, sizeof(line), netstat)) {

                unsigned int  temp_local_address, temp_port;
                char temp_state[STATE_LENGTH];

                //형식에 맞게 문자열을 파싱.
                sscanf(line, "%*d: %x:%hx %*x:%hx %s IGNORE",
                         &temp_local_address, &temp_port, &temp_state);

                //if (strcmp(disk_name, DISK_NAME) == 0){
                        local_address = temp_local_address;
                        port = temp_port;
                        strncpy(state, temp_state, STATE_LENGTH);
                        state[STATE_LENGTH -1] = '\0; // 값을 초과하지 않도록 보장
                //      break
                //      ;
                //}
                //
                        printf("Local Address: %x   ",local_address );
                        printf("Port:%hx   ",port );
                        printf("State: %s\n ",state );
        }

        fclose(netstat);

        //printf("Local Address: %x ",local_address );
        //printf("Port:%hx ",port );
        //printf("State: %s ",state );

        return 0;

0개의 댓글