Signal Handling Example (linux C/C++)


Signal Handling Example (linux C/C++)

#include <iostream>
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <fstream>

class TestClass{
public:
    static void handle_signal(int signal);
};
void TestClass::handle_signal(int signal) {
    //char *signalName;
    std::string signalName = "";
    sigset_t pending;
    switch(signal) {
        case SIGHUP:
            signalName = "SIGHUP";
            break;
        case SIGINT:
            signalName = "SIGINT";
            break;
        case SIGTERM:
            signalName = "SIGTERM";
            break;
        case SIGQUIT:
            signalName = "SIGQUIT";
            break;
        case SIGKILL:
            signalName = "SIGKILL";
            break;
        default:
            printf("Caught unknown signal: %d\n", signal);
            return;
    }
    //실행하고 싶은 함수        
    std::ofstream outFile("./output.txt"std::ios::app);
    printf("Linux signal occurred. signal[%d] : name[%s]\n", signal, signalName.c_str());
    std::string str(std::string("Linux signal occurred. signal[") + std::to_string(signal) + "] signal Name["std::string(signalName) + "]");
    outFile << str << std::endl;
    outFile.close();
    //exit(0);
}
int main(int argcchar* arv[]) {
    TestClass *A = new TestClass();
    struct sigaction signalhandler;
    //stack_t sigstk; //for seg.fault
    //if ((sigstk.ss_sp = (char *)//malloc(SIGSTKSZ*2))==NULL) {
    //fprintf(stderr, "can't alloc alt stack\n");
    //}
    //sigstk.ss_size = SIGSTKSZ*2;
    //sigstk.ss_flags = 0;
    //if(sigaltstack(&sigstk, (stack_t *) 0) < 0) {
    //perror("sigaltstack");
    //}
    signalhandler.sa_handler = &TestClass::handle_signal;
    sigemptyset(&signalhandler.sa_mask);
    signalhandler.sa_flags = SA_RESETHAND | SA_ONSTACK;
    sigaction(SIGSEGV, &signalhandler,NULL);
    sigaction(SIGHUP, &signalhandler,NULL);
    sigaction(SIGINT, &signalhandler,NULL);
    sigaction(SIGTERM, &signalhandler,NULL);
    sigaction(SIGQUIT, &signalhandler,NULL);
    sigaction(SIGKILL, &signalhandler,NULL);

    while(1) {
    }

    return 1;
}



#Signal #Signal Handling #Signal Handler #C #C++ #Linux #Embedded

java.net.SocketException: socket failed: EACCES (Permission denied)

App.manifests.Androidmanifest.xml

error:
java.net.SocketException: socket failed: EACCES (Permission denied)

solve:
add : Manifest.xml file

<uses-permissionandroid:name="android.permission.INTERNET"


example:

<?xmlversion="1.0"encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.androidclient">

<uses-permissionandroid:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activityandroid:name=".MainActivity">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN"/>

<categoryandroid:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>

</manifest>



#Android #Java #Permission denied

pure virtual function call (C/C++)

armv7 toolchain Error

error message:
pure virtual function call

solve:
1. Occurs when calling a virtual function from a constructor or destructor.
2. Compiler option did not write -march==armv7-a.

example :
arm-linux-gnueabi-g++ -fno-omit-frame-pointer -march=armv7-a -funwind-tables

#toolchain #embedded #C #C++

Terminate called out an active extension / Aborted (C/C++)


You can build it, but when you run it,
Execute and die when an error occurs.

Error Message:
Terminate called out an active extension
Aborted


Problem
Occurs when coding using "std::thread"

Cause / Solution
When coding using "std::thread", it is caused by not inserting "join"


Example Code:
class TEST {
TEST();
~TEST();

void init();
void end();
std::shared_ptr<std::thread> th = nullptr;

void exec(){}
}

void TEST::init() {
    th = std::make_shared<std::thread>(&TEST::exec , this);
}
void TEST::end() {
if(th != nullptr) {
th->join();
th = nullptr;
}
}

int main() {
Test *t = new TEST();
t->init();

if( t != nullptr ) {
delete t;
t = nullptr;
}
// If this program ends here, an error will occur.

//add code
t->end();
if( t != nullptr ) {
delete t;
t = nullptr;
}
//solved code !
}




#linux #embedded #C #C++ #debug #error #thread #join

wstring to string / string to wstring / utf16 to utf8 / utf8 to utf16(C/C++)

wstring to string / string to wstring

for utf16 parsing error


#include <locale>
#include <codecvt>
#include <string>

std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::string Str_UTF8 = converter.to_bytes(utf16String);
std::wstring wideString_UTF16 = converter.from_bytes(utf8String);

For use, you should modify the bold writing.

#utf16 #utf8 #wstring #string #C #C++ #Embedded #Linux

Function execution time Example. (C++)


std::chrono::system_clock::time_point start = std::chrono::system_clock::now();

myFunc();

std::chrono::duration<double> sec = std::chrono::system_clock::now() - start;

std::cout << "The time taken to perform the function myFunc()  : " << sec.count() << " seconds" << std::endl;


Create Thread Class Example (C++)


The class "std :: thread" exists but has been created for fun.



ThreadClass.h

#pragma once
#include <iostream>
#include <windows.h>

class ThreadClass
{
public:
ThreadClass();
~ThreadClass();

void start();
void stop();
bool isRun();

static DWORD __stdcall run_(void* p);

virtual void run() = 0;

protected:
bool threadRunFlag;
HANDLE m_Thread;
};




ThreadClass.cpp


#include "ThreadClass.h"


//
//\brief constructor,
//\param
//\return
//
ThreadClass::ThreadClass()
{
this->threadRunFlag = false;
}


//
//\brief destructor
//\param
//\return
//
ThreadClass::~ThreadClass()
{
if (this->isRun()) {
this->stop();
}
}

//
//\brief  thread start
//\param
//\return
//
void ThreadClass::start()
{
m_Thread = CreateThread(0, 0, run_, (void*)this, 0, 0);
}

///
///\brief thread end
///\param
///\return
///
void ThreadClass::stop()
{
this->threadRunFlag = false;
// to be...
}

//
//\brief thread status
//\param
//\return
//
bool ThreadClass::isRun()
{
return this->threadRunFlag;
}

//
//\brief thread run
//\param
//\return
//
DWORD __stdcall ThreadClass::run_(void * p)
{
ThreadClass* const THISCLASS = static_cast<ThreadClass*>(p);
THISCLASS->threadRunFlag = true;
THISCLASS->run();

return 0;
}

Apartment Buying Guide 2025: Shocking Red Flags You Should NEVER Ignore!

 🏙️ Apartment Buying Guide 2025: Shocking Red Flags You Should NEVER Ignore! 🚨 Are you thinking about buying an apartment in 2025? 🏢  It’...