顯示具有 [程式設計]C++ 標籤的文章。 顯示所有文章
顯示具有 [程式設計]C++ 標籤的文章。 顯示所有文章

2022年11月15日 星期二

Signal

1) SIGHUP

本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联。


登录Linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个 Session。当用户退出linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进 程组和后台有终端输出的进程就会中止。不过可以捕获这个信号,比如wget能捕获SIGHUP信号,并忽略它,这样就算退出了Linux登录,wget也 能继续下载。

2022年8月28日 星期日

C语言函数sscanf()的各種用法

sscanf() - 从一个字符串中读取与指定格式相符的数据到後面的變數組。

函数原型:

int sscanf( string str, string fmt, mixed var1, mixed var2 ... );

int scanf( const char *format [,argument]... );


说明:

sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。其中的format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}

2021年5月18日 星期二

【Linux】在程式中處理Ctrl+C,讓程式正常結束

Ctrl+C會結束程式,造成不可預測的結果,尤其在系統資源的釋放上更是重要,像是一些通訊用的port沒有被釋放,就要等它timeout才能再次使用。因此,程式必須設法獲知Ctrl+C的發生並進行處理。在Linux下,按下Ctrl+C後,程式會收到一個訊號SIGINT;這時作業系統預設會結束程式。如果程式不想被預設處理,就要設定對SIGINT訊號的處理函式(Handler)。下面是一個簡單的例子:

2021年4月12日 星期一

C++使用OpenSSL进行RSA加密和解密

1. RSA加密和解密基础概念

    RSA是一种非对称加密。

    RSA秘钥:私钥和公钥,一对私钥和公钥是唯一的,用私钥加密后必须用对应的公钥才能解密,用公钥加密后必须用对应的私钥才能解密。

    加密和解密方式:公钥加密-私钥解密,私钥加密-公钥解密

2021年3月16日 星期二

動態陣列 in C

如果一開始就宣告陣列的大小,沒用那麼多的話就浪費,由其在embedded system下記憶體可是很寶貴的,大大影響了產品的成本價值。

宣告動態陣列

資料型態 *ptr;

        ptr = (資料型態*)malloc(sizeof(資料型態)*cnt);

指標陣列

每一個陣列都是指標變數,指向記憶體大小為stData_t的位址,所以對編譯器的判斷來說陣列優先於指標,看起來像是stData_t *(pData[4])的感覺。

2021年2月2日 星期二

snprintf的特別用法

即使寫了很多年的C,還是會遺忘這個用法,

呼叫 snprintf 時,第一個參數若指定 NULL,第二個參數指定 0 的話,可以用來決定緩衝區的大小,例如:

#include <stdio.h>

int main(void) 

{

    int n = snprintf(NULL, 0, "%d %f %s %d %d %d %s",  25, 54.32E-1, "Thompson", 56, 789, 123, "56");

    char str[n + 1]; // 記得最後會有個空字元

    snprintf(str, sizeof(str),  "%d %f %s %d %d %d %s",  25, 54.32E-1, "Thompson", 56, 789, 123, "56"    );

    printf("%s", str);

    return 0;

}

2021年1月10日 星期日

結構體位元組對齊 pragma pack,__attribute__(packed)

程式編譯器對結構的儲存的特殊處理確實提高CPU儲存變數的速度,但是有時候也帶來了一些麻煩,我們也屏蔽掉變數預設的對齊方式,自己可以設定變數的對齊方式。


例如我們設定結構體的對齊方式:

struct student

{

    int age;

    char c;

};

2020年12月13日 星期日

pthread mutex example in C

互斥量(Mutex)從本質上說就是一把鎖, 提供對共享資源的保護訪問。

1. 初始化:

在Linux下, 線程的互斥量數據類型是pthread_mutex_t. 在使用前, 要對它進行初始化:

對於靜態分配的互斥量, 可以把它設置為PTHREAD_MUTEX_INITIALIZER, 或者呼叫pthread_mutex_init.

對於動態分配的互斥量, 在申請內存(malloc)之後, 通過pthread_mutex_init進行初始化, 並且在釋放內存(free)前需要呼叫pthread_mutex_destroy.

2020年7月6日 星期一

工程師的C語言筆記

編譯 C 程式分為四個步驟:

前處理 (Preprocessing):將含巨集 (macro) 的 C 程式碼轉換成沒有巨集的 C 程式碼
編譯 (Compilation):將 C 原始碼轉換成等效的組合語言原始碼
組譯 (Assembly):組譯會將組合語言原始碼轉換成機械碼,轉換後的檔案為目的檔 (object files)。
連結 (Linking):將目的檔轉為執行檔 (executable)。

【註解】

單行註解以 // 開頭,多行註解用 /* 和 */ 把註解文字包起來。
利用巨集來註解掉整段程式碼的手法:
#if 0
    printf("It won't compile\n");
#endif

這樣操作的原理在於巨集會在編譯前就執行,相關程式碼會被抹去,等同於這段程式碼不存在。