2011-07-30 67 views
4

如何在信號處理程序中設置long類型的變量(在64位機器上= 8字節)?我讀過你只能使用sig_atomic_t類型的變量,它實際上是作爲volatile int在信號處理程序中實現的,修改大於int的數據類型是不安全的。在信號處理程序中使用長數據。

回答

4

可以在信號處理程序裏面使用一個long,實際上你可以使用任何東西。唯一應該注意的是正確的同步,以避免競爭條件。

sig_atomic_t應該用於信號處理程序和其餘代碼之間共享的變量。信號處理器的任何變量「私有」可以是任何類型,任何大小。

示例代碼:

#include <signal.h> 

static volatile long badShared; // NOT OK: shared not sig_atomic_t 
static volatile sig_atomic_t goodShared; // OK: shared sig_atomic_t 

void handler(int signum) 
{ 
    int localInt = 17; 
    long localLong = 23; // OK: not shared 

    if (badShared == 0) // NOT OK: shared not sig_atomic_t 
     ++badShared; 

    if (goodShared == 0) // OK: shared sig_atomic_t 
     ++goodShared; 
} 

int main() 
{ 
    signal(SOMESIGNAL, handler); 
    badShared++; // NOT OK: shared not sig_atomic_t 
    goodShared++; // OK: shared sig_atomic_t 

    return 0; 
} 

如果你想使用一個共享變量以外sig_atomic_t利用原子能公司(atomic_long_readatomic_long_set)。

+0

您不能使用鎖與信號處理程序同步 - 它只會因爲信號處理程序不像線程那樣並行運行而導致死鎖。 – interjay

+0

@interjay:謝謝,修正。 –