Linux C/C++程式設計:sig_atomic_t
阿新 • • 發佈:2021-01-02
技術標籤:# C++
資料型別sig_atomic_t,當把變數宣告為該型別會保證該變數在使用或賦值時, 無論是在32位還是64位的機器上都能保證操作是原子的, 它會根據機器的型別自動適應。
- 在處理訊號(signal)的時候,有時對於一些變數的訪問希望不會被中斷,無論是硬體中斷還是軟體中斷,這就要求訪問或改變這些變數需要在計算機的一條指令內完成
- 通常情況下,int型別的變數通常是原子訪問的,也可以認為 sig_atomic_t就是int型別的資料,因為對這些變數要求一條指令完成,所以sig_atomic_t不可能是結構體,只會是數字型別。
#include <signal.h>
typedef int __sig_atomic_t;
typedef __sig_atomic_t sig_atomic_t;
- 另外gnu c的文件也說比int短的型別通常也是具有原子性的,例如short型別。同時,指標(地址)型別也一定是原子性的。 該型別在所有gnu c庫支援的系統和支援posix的系統中都有定義。
使用
#include <signal.h>
#include <stdio.h>
volatile sig_atomic_t gSignalStatus = 0;
void signal_handler(int signal)
{
gSignalStatus = signal;
}
int main(void)
{
/* Install a signal handler. */
signal(SIGINT, signal_handler);
printf("SignalValue: %d\n", gSignalStatus);
printf("Sending signal %d\n", SIGINT);
raise(SIGINT);
printf("SignalValue: %d\n", gSignalStatus);
}