linux系統編程之訊號(四):alarm和可重新進入函數

來源:互聯網
上載者:User

一,alarm()

在將可重新進入函數之前我們先來瞭解下alarm()函數使用:

#include <unistd.h>

unsigned int alarm(unsigned int seconds)

系統調用alarm安排核心為調用進程在指定的seconds秒後發出一個SIGALRM的訊號。如果指定的參數seconds為0,則不再發送 SIGALRM訊號。後一次設定將取消前一次的設定。該調用傳回值為上次定時調用到發送之間剩餘的時間,或者因為沒有前一次定時調用而返回0。

注意,在使用時,alarm只設定為發送一次訊號,如果要多次發送,就要多次使用alarm調用。

man協助說明:


DESCRIPTION
       alarm()  arranges  for  a SIGALRM signal to be delivered to the calling
       process in seconds seconds.

       If seconds is zero, no new alarm() is scheduled.

       In any event any previously set alarm() is canceled.

RETURN VALUE
       alarm() returns the number of seconds remaining  until  any  previously
       scheduled alarm was due to be delivered, or zero if there was no previ-
       ously scheduled alarm.

樣本:

#include <unistd.h><sys/stat.h><sys/wait.h><sys/types.h><fcntl.h><stdlib.h><stdio.h><errno.h><.h><signal.h> ERR_EXIT(m) \    ( handler( main( argc,  * (signal(SIGALRM, handler) ==  handler(

結果:

<sys/stat.h><sys/wait.h><sys/types.h><fcntl.h><stdlib.h><stdio.h><errno.h><.h><signal.h> ERR_EXIT(m) \ ( handler( main( argc, *= {, = {, (signal(SIGALRM, handler) ===== handler(

結果:

也是程式建立了一個結構體,設定一個全域變數,然後在main函數中利用兩個局部變數分別給全域變數賦值,由於這個賦值操作是可被中斷的,如以上每一次結構體的賦值可視為兩步:

g_data.a=zeros.a;

g_data.b=zeros.b;

所以當g_data.a=one.a;做完然後被中斷,跑去執行處理函數,在處理函數中調用unsafe_fun()列印全域變數值,可知結果是全域變數a值變了,b值還是之前的沒來的及改變,所以出現了1,0

所以結果不確定

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.