Windows C++ 로 시스템 CPU 사용률 출력하기

프로그래밍/C, C++|2021. 4. 22. 08:53
반응형

#include <Windows.h>

#include <iostream>

using namespace std;

static float CalculateCPULoad();

static unsigned long long FileTimeToInt64();

float GetCPULoad();

int main()

{

    printf("%.1f", GetCPULoad()); // 소수점 1자리까지 출력

    return 0;

}

static float CalculateCPULoad(unsigned long long idleTicks, unsigned long long totalTicks)

{

    static unsigned long long _previousTotalTicks = 0;

    static unsigned long long _previousIdleTicks = 0;

    unsigned long long totalTicksSinceLastTime = totalTicks - _previousTotalTicks;

    unsigned long long idleTicksSinceLastTime = idleTicks - _previousIdleTicks;

    float ret = 1.0f - ((totalTicksSinceLastTime > 0) ? ((float)idleTicksSinceLastTime) / totalTicksSinceLastTime : 0);

    _previousTotalTicks = totalTicks;

    _previousIdleTicks = idleTicks;

    return ret;

}

static unsigned long long FileTimeToInt64(const FILETIME& ft) { return (((unsigned long long)(ft.dwHighDateTime)) << 32) | ((unsigned long long)ft.dwLowDateTime); }

// Returns 1.0f for "CPU fully pinned", 0.0f for "CPU idle", or somewhere in between

// You'll need to call this at regular intervals, since it measures the load between

// the previous call and the current one.  Returns -1.0 on error.

float GetCPULoad()

{

    FILETIME idleTime, kernelTime, userTime;

    return GetSystemTimes(&idleTime, &kernelTime, &userTime) ? CalculateCPULoad(FileTimeToInt64(idleTime), FileTimeToInt64(kernelTime) + FileTimeToInt64(userTime)) : -1.0f;

}

 

[출처] https://stackoverflow.com/questions/23143693/retrieving-cpu-load-percent-total-in-windows-with-c

 

반응형

댓글()

Visual Studio 2019 설치 (C / C++컴파일러) 및 몇가지 컴파일 에러 해결 방법

프로그래밍/C, C++|2021. 4. 19. 10:56
반응형

아래 URL 에서 Visual Studio 를 다운로드 할 수 있습니다.

https://visualstudio.microsoft.com/ko/thank-you-downloading-visual-studio/?sku=Community&rel=16

 

Installer 실행시 개발 종류에 대해 선택하는데 여기서는 'C++ 데스크톱 개발' 을 선택하고 설치하였습니다.

 

 

[ 사용해보기 - 예제 및 컴파일 ]

Visual Studio 가 설치 되면 실행을 하고 새 프로젝트 (빈 프로젝트) 를 생성합니다.

우측에 솔루션 탐색기가 있는데 그중 '소스 파일' 우클릭 후 '추가 > 새항목 > C++ 파일(.cpp)' 순서로 클릭합니다.

 

1) 예제

#include <stdio.h>

int main() {

    printf("hello world!");

    return 0;

}

 

2) 컴파일 방법

Ctrl + F5 를 누르면 컴파일이 되고, 명령프롬프트 창이 뜨면서 파일이 자동으로 실행되어집니다.

간단히 상단 메뉴중 '로컬 Windows 디버거' 버튼을 눌러도 됩니다. (64bit 실행 파일을 만들 경우 앞에 메뉴를 x64 로 선택)

 

컴파일 된 실행 파일은 아래 디렉토리에 있습니다.

C:\Users\{사용자명}\source\repos\{프로젝트명}\x64\Debug\{프로젝트명}.exe

 

 

* 참고

pthread 사용방법

https://wnsgml972.github.io/c/2018/05/07/c_windows_pthread/

 

socklen_t 코드 사용법

#include <WS2tcpip.h> 추가

 

strcpy 사용시

프로젝트 > 속성 > C/C++ (전처리기) > 전처리기 정의 에 '_CRT_SECURE_NO_WARNINGS' 추가

 

'timespec' 'struct' 에러 처리법

#define HAVE_STRUCT_TIMESPEC 추가

 

아래와 유사한 에러가 발생된 경우

에러 : LNK2019 __imp_acceptmain 함수에서 참조되는 확인할 수 없는 외부 기호

#pragma comment(lib, "ws2_32.lib") 추가

반응형

댓글()

Windows 에서 c 컴파일러 MinGW 설치하기

프로그래밍/C, C++|2021. 4. 19. 10:28
반응형

윈도우즈에서 gcc 명령을 사용하는 방법 입니다.

간편히 사용할 수 있으나 간혹 백신이 설치된 곳에서는 gcc 명령으로 컴파일 된 파일 실행시 바이러스로 구분 될 수 있으므로

(hello world 메세지를 출력하는 간단한 예제 파일도)

Visual Studio 로 설치하여 컴파일 하여 실행하면 백신에 걸리지 않습니다.

* Visual Studio 설치하기 : https://sysdocu.tistory.com/1639

 

 

1. 설치

윈도우즈에서 gcc 명령을 사용하기 위해 아래 URL 에서 최신 프로그램을 다운로드 합니다.

 

https://sourceforge.net/projects/mingw-w64/files/mingw-w64/ 

 

웹페이지 접속 후 스크롤을 조금만 내려보면 MinGW-W64 GCC-8.1.0 항목에
x86_64-posix-seh 라는 다운로드 링크가 있습니다.

설치하려는 시스템이 64bit 인 경우 이 파일을 다운로드 합니다.

 

압축 해제 후 생성된 mingw64 디렉토리를 임의의 위치로 옮겨 줍니다.

여기에서는 C:\mingw64 로 옮겼습니다.

 

 

2. 설정

설치 완료 후 

'내 PC' 우클릭 '속성' [시스템] > [고급 시스템 설정] > [환경 변수] > [시스템 변수] 의 'Path' 선택 후 '편집' 버튼을 누릅니다.

'C:\mingw64\bin' 경로를 추가하고 확인 버튼을 눌러 저장합니다.

 

 

3. 확인

[시작] > [실행] 을 눌러 'cmd' 입력, 엔터를 치고

명령 프롬프트에서 'gcc -v' 명령을 수행하면 gcc 버전이 출력되는 것이 확인됩니다.

 

반응형

댓글()

Ubuntu 18.04 에서 KVM 으로 Android 9 설치하기 (네트워크 확인중)

리눅스/OS 일반|2021. 4. 15. 10:37
반응형

KVM 이라는 하이퍼바이저를 통해 가상 머신을 생성하는 방법 입니다.

 

 

1. 설치

# apt -y install qemu-kvm libvirt-bin bridge-utils ubuntu-vm-builder libvirt-daemon-system virtinst cpu-checker virt-manager

 


2. 설정

# adduser root libvirt
# adduser root kvm
# adduser sysdocu libvirt
# adduser sysdocu kvm

 

# vi /tmp/br0.xml

<network>
    <name>br0</name>
    <forward mode='bridge'/>
    <bridge name='br0'/>
</network>

# virsh net-define /tmp/br0.xml

# virsh net-start br0
# virsh net-autostart br0


3. 실행

아래와 같이 명령어로 실행합니다.
아이콘으로 실행할 경우 libvirtd 접근이 되지 않을 수 있습니다.

# virt-manager

 

 

4. VM 생성

* Android OS 이미지 다운로드 사이트 : https://www.android-x86.org 

 

설치할 OS 이미지 파일(iso) 을 /var/lib/libvirt/images 경로에 저장합니다.
여기에서는 android 9 버전의 파일을 아래와 같이 받았습니다.

 

# cd /var/lib/libvirt/images
# wget https://chuangtzu.ftp.acc.umu.se/mirror/osdn.net/android-x86/71931/android-x86-9.0-r2.iso

 

virt-manager 를 실행하여 가상서버를 생성합니다.

 

# virt-manager

 

(설치 과정 요약..)

GPT 사용안함

통파티션 /, ext4 로 만들기 (OS가 약 2.1G 사용함)

grub 설정은 모두 yes

 

안드로이드 부팅 후 마우스 커서가 창에서 빠져나오지 않을 경우에는 아래 키를 누르면 됩니다.

Ctrl + Alt

 

 

5. VM 네트워크 설정

 

안드로이드에 네트워크를 연결하는 방법입니다.

일단 VM 을 가동 합니다. 상단의 '보기' > '상세정보' 를 선택하면 좌측에 VM 세부설정 가능한 메뉴가 뜹니다.

 

NIC 선택

- 네트워크 소스 : 가상 네트워크 'br0' : Bridge 네트워크

- 장치 모델 : (변경 안함)

 

[적용] 버튼을 누른 후 VM 을 재시작 합니다.

 

 

[참조]

https://hiseon.me/server/ubuntu-kvm-install/ 

https://blog.iolate.kr/265 

 

 

반응형

댓글()

Ubuntu 18.04 내에서 안드로이드 (Android) 에뮬레이터 구동하기

프로그래밍/Android (Java)|2021. 4. 15. 09:27
반응형

에뮬레이터 공식 홈페이지 : https://anbox.io/

 

Android 테스트를 위해 리눅스에 Androud Emulator 를 설치하였습니다. (현재 Android 버전 : 7.1.1)

아래는 Ubuntu 18.04 에서 snap 을 이용하여 Anbox 를 설치하는 방법 입니다.

 


 1. 설치

Anbox Support PPA 를 등록합니다.

 

# add-apt-repository ppa:morphis/anbox-support
# apt -y update
# apt -y install linux-headers-generic anbox-modules-dkms
# modprobe ashmem_linux
# modprobe binder_linux

snap 을 이용해 Anbox 를 설치 합니다.

 

# apt -y install snap snapd

# snap install --devmode --beta anbox

 

우분투 '프로그램 표시' 에서 설치된 'Anbox Application manager' 를 볼 수 있습니다.

하지만 Google Play Store 가 보이지 않습니다.

아래 작업을 추가로 진행하면 아이콘이 추가되고 사용이 가능합니다.

 

 

2. 추가 작업 (Google Play Store)

 

# apt -y install curl wget lzip unzip squashfs-tools

# wget https://raw.githubusercontent.com/geeks-r-us/anbox-playstore-installer/master/install-playstore.sh

# bash install-playstore.sh

 

다시 'Anbox Application manager' 를 실행하면 Google Play Store 아이콘이 보이게 됩니다.

 

 

3. apk 파일 설치

apk 패키지 파일을 설치하는 방법은 아래와 같습니다.

# apt install android-tools-adb
# adb install my.apk    // 미리 다운로드 받은 파일을 설치합니다.

 

혹시 아래와 같은 에러를 만난 경우의 조치법입니다. -t 옵션을 추가하면 간단히 해결 됩니다.

# adb install my.apk

adb: failed to install my.apk: Failure [INSTALL_FAILED_TEST_ONLY: installPackageLI]

 

# adb install -t my.apk

Success

 

다시 'Anbox Application manager' 를 실행하면 설치했던 앱이 보입니다.

 

반응형

댓글()

파일과 현재시간의 timestamp 구하기, 차이 계산하기

프로그래밍/BASH SHELL|2021. 3. 26. 08:06
반응형

특정 파일이 쓰여진 날짜의 timestamp 를 time_close 변수에 기록합니다.

time_close=`stat -c %Y /var/spool/mail/sysdocu`

 

현재시간 timestamp 를 time_now 변수에 기록합니다.

time_now=`date +%s`

 

두 값의 차이를 계산 합니다. (초)
time_diff=`expr $time_now - $time_close`

 

계산된 값을 출력합니다.

echo $time_diff

 

 

반응형

댓글()

메일 포워딩 하면서 수신자 이메일 변경하기 (sendmail + incrontab + shell script)

리눅스/Mail|2021. 3. 25. 15:30
반응형

아래와 같은 상황이 발생하여 이를 해결하고자 스크립트를 작성하였습니다.

비슷한 경우에 있으신 분은 아래 스크립트를 참고하시기 바랍니다.

 

[상황]

메일을 받아서 다른 이메일 주소로 포워딩 해줘야 함.

하지만 사용자 홈디렉토리에 .forward 파일을 만들고 아래와 같이 사용했으나

포워딩 받은 이메일을 열어보니 메일 수신자가 변경되지 않고 그대로 쓰여있음이 확인됨 (sysdocu@sysdocu.com)

sysdocu@sysdocu.com // 사본을 남기기 위해 내 계정 입력

sysdocu@tistory.com    // 메일을 포워딩 받을 이메일 주소

 

[목표]

메일 발송 : A >>> B (포워딩) >>> C

메일을 포워딩 하고 받는 사람이 메일을 열었을때 '메일 정보'에서 송신자(A) 이메일 주소는 그대로, 수신자는 최종 수신자(C)의 메일 주소로 되어 있기를 희망

 

 

[방법]

icrontab 을 활용하여 /var/mail/sysdocu (메일함) 에 쓰기가 멈추었을때 저장된 메일을

쉘스크립트를 이용해 수신자를 편집하고 포워딩 해주면 됩니다.

여기서는 CentOS 기준으로 작성합니다. Ubuntu 환경에서 구성하는것은 별도 포스팅을 참고해주세요.

(https://sysdocu.tistory.com/1498)

 

메일이 쓰여진것을 확인하기 위해 파일 감지 패키지를 설치합니다.

# yum -y install incron

 

부팅시 자동 시작 설정과 현재 데몬을 구동합니다.

# systemctl enable incrond

# systemctl start incrond

 

파일 이벤트 (쓰기) 가 발생 되었을때 /root/run.sh 스크립트를 실행하도록 합니다.

한 통의 메일을 받더라도 IN_CLOSE_WRITE 이벤트가 빈번히 일어나므로 IN_ONESHOT 을 이용해 1회만 실행하도록 합니다.

나중에 스크립트에서 모든 처리가 완료되면 incrond 데몬을 재시작 하도록 했습니다.

# incrontab -e

/var/spool/mail/sysdocu    IN_CLOSE_WRITE,IN_ONESHOT    /root/run.sh

 

root 사용자의 incron 작업을 허용하고 적용해줍니다.

# vi /etc/incron.allow

root

 

# systemctl restart incrond

 

스크립트 내용을 작성합니다.

도착한 메일의 수신자를 수정하고 포워딩 하는 부분입니다.

그리고 메일이 쌓이면 쌓인만큼 여러개의 메일이 포워딩 되므로 포워딩 처리한 메일은 삭제해주는 것이 좋습니다.

 

# vi /root/run.sh

#!/bin/bash

date >> /root/result.txt
echo "스크립트 시작" >> /root/result.txt

# 쓰기 종료 확인시 진행
while : 
do

    # 메일 쓰기 종료 대기
    sleep 3

    # 시간 비교
    time_close=`stat -c %Y /var/spool/mail/sysdocu`
    time_now=`date +%s`
    time_diff=`expr $time_now - $time_close`

    # 메일 처리
    if [ "$time_diff" -gt "2" ]; then

        cat /var/spool/mail/sysdocu >> /root/sysdocu    # 백업
        sed -i "s/^To: .*$/To: sysdocu@tistory.com/" /var/spool/mail/sysdocu    # 수신자 변경
        cat /var/spool/mail/sysdocu |formail -s sendmail sysdocu@tistory.com    # 포워딩
        cat /dev/null > /var/spool/mail/sysdocu    # 비우기
        systemctl restart incrond    # 파일이벤트 준비 (IN_ONESHOT 때문에 재시작 필요)
        echo "메일 포워딩 완료" >> /root/result.txt    # 결과 기록
        echo "" >> /root/result.txt
        exit 0

    else
        echo "파일쓰기 종료 대기중" >> /root/result.txt
    fi

done

* /var/spool/mail/sysdocu : 사용자 이름의 메일함 (메일 파일)

* sysdocu@tistory.com : 넘겨받는 메일 계정

 

# chmod 700 /root/run.sh

 

이제 외부에서 sysdocu@sysdocu.com 로 메일을 보내면

sysdocu@tistory.com 이 받는것처럼 보여집니다.

 

반응형

댓글()

리눅스 CentOS, Ubuntu 에서 Android-x86 설치하기

프로그래밍/Android (Java)|2021. 3. 25. 09:36
반응형

Android-x86 은 가상 머신처럼 별도의 창에서 Android 를 사용하는것이 아니고,

PC 부팅시 커널 선택 화면에서 Android-x86 을 선택하면 Android 환경으로 부팅이 됩니다.

 

1. 다운로드

 

아래 주소에서 원하는 Android 버전을 다운로드 합니다.

CentOS 에서는 .rpm 파일을 받으면 되지만

Ubuntu 에서는 .deb 파일이 보이지 않으므로 그냥 .rpm 파일을 받습니다.

 

https://www.android-x86.org/

 

2. 설치

 

1) CentOS

# rpm -ivh android-x86-9.0-r2.x86_64.rpm

 

2) Ubuntu

# apt -y install alien

# alien -ci android-x86-9.0-r2.x86_64.rpm

 

3. 적용

 

# reboot

부팅시 Android-x86 선택

 

 

반응형

댓글()

CentOS 에서 CPU, Memory, HDD 부하 주는 방법 (스트레스 테스트)

리눅스/OS 일반|2021. 3. 19. 07:49
반응형

[ 리눅스에 stress 툴 설치 ]

 

Stress 툴 설치하기 전에 EPEL 레포지터리를 활성화 합니다.

# yum -y install epel-release

 

Stress 툴을 설치합니다.

# yum -y install stress

 

 

[ Stress 툴 사용 방법 예제 ]

 

1. CPU 부하 주는 방법

 

# stress -c <코어 수>

grep -c processor /proc/cpuinfo 명령어를 통해 CPU 코어 전체 개수를 확인할 수 있습니다.

stress 툴에 코어 수를 지정하면 해당 코어는 100%를 사용하게 됩니다.

 

 

2. Memory 부하 주는 방법

 

# stress --vm <프로세스 수> --vm-bytes <사용할 크기>

예 : stress --vm 3 --vm-bytes 1024m

 

 

3. HDD 부하 주는 방법

 

# stress --hdd <hdd 수> --hdd-bytes <사용할 크기>

예 : stress --hdd 3 --hdd-bytes 1024m



출처: https://klero.tistory.com/entry/리눅스-stress-툴을-통해-CPU-Memory-스트레스-부하-주는-방법 [Klero]

반응형

댓글()

애드몹 광고가 출력되지 않는 경우

프로그래밍/Android (Java)|2021. 3. 18. 09:19
반응형

애드몹 광고가 안나오는 경우

 

아래는 경험을 바탕으로 작성되었으며, 다른 경우가 존재할 수 있으므로 참고로만 살펴보세요.

 

1) 구글플레이에 개발자로 등록하고 어플 등록 (개시하지 않더라도) 하면 나올것임

 

2) 구글 광고 테스트ID 가 아니고 발급받은 광고ID 로 테스트를 계속할 경우

    처음에는 잘 나오다가 광고가 소진되어 화면이 하얗게만 나올 수 있음

    이때는 app-release.apk 로 빌드하고 설치해보면 잘 나옴

 

* 에러 증상을 확인하는 코드

 

        // mAdView.loadAd(adRequest); 로 광고를 불러올 경우

        mAdView.setAdListener( new AdListener() {

            @Override

            public void onAdLoaded() {

                super.onAdLoaded();

                Toast.makeText(getApplicationContext(), "광고 출력 되었습니다.", Toast.LENGTH_SHORT ).show();

            }

            @Override

            public void onAdFailedToLoad(int i) {

                super.onAdFailedToLoad(i);

                String errorMsg = "에러 코드 : (" + i + ")";

                Toast.makeText(getApplicationContext(), errorMsg, Toast.LENGTH_SHORT ).show();

            }

        });

 

 

 

 

반응형

댓글()

IIS FTP 설정

윈도우즈/IIS|2021. 3. 15. 13:03
반응형

1. IIS 실행 > FTP 사이트 추가

    - 사이트 이름 및 디렉토리 입력

    - SSL 사용하지 않음

    - 인증 : 기본

       권한 부여 : 특정 사용자 (계정 선택)

       사용 권한 : 읽기, 쓰기

 

2. 패시브모드 (선택 사항)

    IIS 좌측 트리구조에서 '서버 이름' 선택 > 'FTP 방화벽 지원' 에서 포트 5001-5010 입력

 

3. IIS 재시작

    시작 > 실행 > services.msc 에서 'Microsoft FTP Service' 를 선택, 우클릭 후 '다시 시작'을 누릅니다.

    * IIS 에서 하지말고 꼭 services.msc 에서 해주어야 함

 

4. 방화벽 허용

    인바운드 규칙에서 아래 룰 추가

    - FTP Service / 포트 / TCP 21

    - FTP Service / 포트 / UDP 20

 

반응형

댓글()