1. 程式人生 > 其它 >Linux C/C++程式設計:sig_atomic_t

Linux C/C++程式設計:sig_atomic_t

技術標籤:# 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); }

在這裡插入圖片描述