4
如何在信號處理程序中設置long
類型的變量(在64位機器上= 8字節)?我讀過你只能使用sig_atomic_t
類型的變量,它實際上是作爲volatile int
在信號處理程序中實現的,修改大於int
的數據類型是不安全的。在信號處理程序中使用長數據。
如何在信號處理程序中設置long
類型的變量(在64位機器上= 8字節)?我讀過你只能使用sig_atomic_t
類型的變量,它實際上是作爲volatile int
在信號處理程序中實現的,修改大於int
的數據類型是不安全的。在信號處理程序中使用長數據。
你可以在信號處理程序裏面使用一個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_read
,atomic_long_set
)。
您不能使用鎖與信號處理程序同步 - 它只會因爲信號處理程序不像線程那樣並行運行而導致死鎖。 – interjay
@interjay:謝謝,修正。 –