久久综合丝袜日本网手机版,日韩欧美中文字幕在线三区,亚洲精品国产品国语在线,极品在线观看视频婷婷

      <small id="aebxz"><menu id="aebxz"></menu></small>
    1. Linux下C編程:信號處置方法實習(xí)運用

      時間:2022-07-03 02:35:43 其他 我要投稿
      • 相關(guān)推薦

      Linux下C編程:信號處置方法實習(xí)運用

      Linux下C編程:信號處置方法實習(xí)運用

      Linux下C編程:信號處置方法實習(xí)運用

      信號是用于一步作業(yè)的。當(dāng)一個信號發(fā)生時,程序會按照現(xiàn)已設(shè)定好的程序來實行相應(yīng)的操作。


      進(jìn)程對信號處置的方法通常有兩種:


      1、捕捉信號:當(dāng)一個信號發(fā)送個進(jìn)程時,該進(jìn)程會調(diào)用此信號注冊的信號處置函數(shù),來結(jié)束相應(yīng)的操作。對應(yīng)于每個信號系統(tǒng)通常會有相應(yīng)的默許處置函數(shù)(通常為間斷進(jìn)程)。所以可以設(shè)置信號為默許的處置函數(shù)。


      2、忽略信號。當(dāng)信號發(fā)送時,進(jìn)程忽略信號。


      注:有兩個信號是無法捕捉和忽略的SIGKILL和SIGSTOP。它們是提供給管理員,可以在任何時辰間斷某個進(jìn)程而設(shè)定的。


      對信號處置的需要:在用戶編程時有時進(jìn)程需要對某信號進(jìn)行當(dāng)即照應(yīng)。對有些實時進(jìn)程來說,當(dāng)它實行時是不愿意被打斷的,這是就需要把接收的信號掛起。


      信號的運用:


      信號最常見的一個運用便是發(fā)生差錯時通知進(jìn)程結(jié)束。關(guān)于許多差錯,如bus差錯,浮點差錯,調(diào)用內(nèi)存差錯等都有相應(yīng)的信號通知進(jìn)程。


      此外信號還有其他用途。如作業(yè)一個大型的科學(xué)運算程序,如果在一個無量循環(huán)頂用printf來閃現(xiàn)作業(yè)情況,必定構(gòu)成作業(yè)功率的下降。所以通過信號,人為的向進(jìn)程發(fā)送消息,來查看作業(yè)情況,就大大的提高了作業(yè)功率。

      Linux下C編程:信號具體含義說明

      信號及其簡介


      信號是一種進(jìn)程通訊的方法,他運用于異步作業(yè)的處置。信號的結(jié)束是一種軟間斷。它被發(fā)送為一個正在作業(yè)的進(jìn)程,已奉告進(jìn)程某個作業(yè)發(fā)生了。


      1) SIGHUP本信號在用戶終端聯(lián)接(正;蚍钦)結(jié)束時宣告,通常是在終端的控制進(jìn)程結(jié)束時,通知同一session內(nèi)的各個作業(yè),這時它們與控制終端不再有關(guān).


      2) SIGINT程序間斷(interrupt)信號,通常是從終端宣告間斷指令如ctrl+c或鍵


      3) SIGQUIT和SIGINT類似,但由QUIT字符(通常是Ctrl+\)來控制.進(jìn)程在因收到SIGQUIT退出時會發(fā)生core文件,在這個含義上類似于一個程序差錯信號.


      4) SIGILL實行了不合法指令.通常是因為可實行文件本身出現(xiàn)差錯,或許妄圖實行數(shù)據(jù)段.庫房溢出時也有可以發(fā)生這個信號.


      5) SIGTRAP跟蹤騙局信號,由斷點指令或其它trap指令發(fā)生.由debugger運用.


      6) SIGABRT調(diào)用abort時發(fā)生的信號,將會使進(jìn)程非正常結(jié)束。


      6) SIGIOT IO差錯信號.


      7) SIGBUS系統(tǒng)總線差錯時發(fā)生的信號,不合法地址,包括內(nèi)存地址對齊(alignment)犯錯.eg:訪問一個四個字長的整數(shù),但其地址不是4的倍數(shù).


      8) SIGFPE在發(fā)生喪身的算術(shù)運算差錯時宣告.不只包括浮點運算差錯,還包括溢出及除數(shù)為0等其它一切的算術(shù)的差錯.


      9) SIGKILL可以間斷任何進(jìn)程的信號,只能由管理員宣告,該信號不會被捕捉和忽略。


      10) SIGUSR1留給用戶運用,用戶可在運用程序中自行定義。


      11) SIGSEGV妄圖訪問未分配給自個的內(nèi)存,或妄圖往沒有寫權(quán)限的內(nèi)存地址寫數(shù)據(jù),不合法運用內(nèi)存地址信號。


      12) SIGUSR2留給用戶運用


      13) SIGPIPE當(dāng)一個進(jìn)程對管道進(jìn)行完讀后進(jìn)行寫時發(fā)生的信號。


      14) SIGALRM時鐘守時信號,由alarm函數(shù)設(shè)定的時辰間斷時發(fā)生的信號。


      15) SIGTERM程序結(jié)束(terminate)信號,與SIGKILL不一樣的是該信號可以被阻塞和處置.通常用來需要程序自個正常退出.shell指令kill缺省發(fā)生這個信號.


      17) SIGCHLD子進(jìn)程結(jié)束或間斷時發(fā)生該信號,父進(jìn)程會收到這個信號.通過該信號父進(jìn)程可以知道子進(jìn)程的作業(yè)情況。但大多數(shù)情況下此信號會被忽略。


      18) SIGCONT讓一個間斷(stopped)的進(jìn)程繼續(xù)實行.本信號不能被阻塞.


      19) SIGSTOP間斷(stopped)進(jìn)程的實行.注意它和terminate以及interrupt的區(qū)別:該進(jìn)程還未結(jié)束,只是暫停實行.本信號不能被阻塞,處置或忽略.


      20) SIGTSTP間斷進(jìn)程的作業(yè),但該信號可以被處置和忽略.用戶鍵入SUSP字符時(通常是Ctrl-Z)宣告這個信號


      21) SIGTTIN當(dāng)后臺作業(yè)要從用戶終端讀數(shù)據(jù)時,間斷驅(qū)動器發(fā)生的信號。當(dāng)讀入數(shù)據(jù)的進(jìn)程阻塞或忽略這個信號,或讀取數(shù)據(jù)的進(jìn)程地址進(jìn)程組是一個孤立進(jìn)程組時,信號不會發(fā)生,而且發(fā)生讀差錯。errno被設(shè)為ETO


      22) SIGTTOU類似于SIGTTIN,當(dāng)后臺作業(yè)要從用戶終端讀數(shù)據(jù)時,間斷驅(qū)動器發(fā)生的信號。當(dāng)讀入數(shù)據(jù)的進(jìn)程阻塞或忽略這個信號,或讀取數(shù)據(jù)的進(jìn)程地址進(jìn)程組是一個孤立進(jìn)程組時,信號不會發(fā)生,而且發(fā)生讀差錯。errno被設(shè)為ETO。僅有不一樣的是進(jìn)程可以選擇后臺寫。


      23) SIGURG socket上出現(xiàn)緊急情況是宣告的信息。


      24) SIGXCPU逾越CPU時辰資源束縛.這個束縛可以由getrlimit/setrlimit來讀取/改動


      25) SIGXFSZ逾越文件大小資源束縛.


      26) SIGVTALRM虛擬時鐘信號.類似于SIGALRM,可是核算的是該進(jìn)程占用的CPU時辰.


      27) SIGPROF類似于SIGALRM/SIGVTALRM,但包括該進(jìn)程用的CPU時辰以及系統(tǒng)調(diào)用的時辰.


      28) SIGWINCH窗口大小改動時宣告.


      29) SIGIO文件描述符準(zhǔn)備就緒,可以初步進(jìn)行輸入/輸出操作.


      30) SIGPWR Power failure電源失效信號。


      31)SIGEMT實時硬件發(fā)生差錯時發(fā)生的信號。


      有兩個信號可以間斷進(jìn)程:SIGTERM和SIGKILL。SIGTERM比照和睦,進(jìn)程能捕捉這個信號,根據(jù)您的需要來關(guān)閉程序。在關(guān)閉程序之前,您可以結(jié)束翻開的記載文件和結(jié)束正在做的任務(wù)。在某些情況下,假定進(jìn)程正在進(jìn)行作業(yè)而且不能間斷,那么進(jìn)程可以忽略這個SIGTERM信號。


      關(guān)于SIGKILL信號,進(jìn)程是不能忽略的。這是一個“我不管您在做什么,立刻間斷”的信號。假定您發(fā)送SIGKILL信號給進(jìn)程,Linux就將進(jìn)程間斷在那里。


      注:有六個信號被稱為作業(yè)信號,SIGCHLD,SIGCONT,SIGSTOP,SIGSTP,SIGTTNI,SIGTTOU.這些信號都是用于協(xié)和諧組織各個進(jìn)程的,也便是結(jié)束所謂的作業(yè)控制。通常情況下用戶不需要對這些信號進(jìn)行處置,shell會自動結(jié)束對這些信號的處置作業(yè)。信號之間是相互影響的,當(dāng)進(jìn)程接收到SIGCONT信號時,被系統(tǒng)懸掛的SIGSTOP,SIGSTP,SIGTTIN,SIGTTOU將失效。一樣進(jìn)程接收到SIGSTOP,SIGSTP,SIGTTIN,SIGTTOU時,SIGCONT將失效。

      Linux下C編程:信號處置

      信號處置是linux程序的一個特征。用信號處置來仿照操作系統(tǒng)的間斷功用。要想運用信號處置功用,你要做的便是填寫一個信號處置函數(shù)即可。


      #include

      #include

      #include

      #include


      int flag = 1;


      void func(int sig)


      {

      printf("I get a signal!\n");

      flag = 0;


      }


      int main()


      {

      signal(SIGINT, func);

      printf("pid:%ld\n",(long)getpid());


      while(flag)

      pause();

      return 0;


      }實行,


      #gcc sig.c -o sig


      #./sig


      在另一終端:


      #kill -INT 333//333是程序打印出的進(jìn)程號