国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

kill,alarm,raise,abort,pause,signal等函數(shù)的使用

這篇具有很好參考價值的文章主要介紹了kill,alarm,raise,abort,pause,signal等函數(shù)的使用。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1.1 kill

kill函數(shù)是UNIX和類UNIX操作系統(tǒng)中的一個標(biāo)準(zhǔn)庫函數(shù),主要用于向指定進(jìn)程發(fā)送信號。

#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int signum);

pid_t pid?是進(jìn)程ID,int signum?是信號的編號。

kill函數(shù)的作用是將signum指定的信號發(fā)送到pid指定的進(jìn)程。

  • pid > 0:將信號發(fā)送給進(jìn)程ID為pid的進(jìn)程。
  • pid = 0:將信號發(fā)送給當(dāng)前進(jìn)程所在的整個進(jìn)程組中的所有進(jìn)程。
  • pid < 0:將信號發(fā)送給進(jìn)程組ID等于pid的絕對值的進(jìn)程組中的所有進(jìn)程。
  • pid = -1:將信號發(fā)送給系統(tǒng)中的所有進(jìn)程,這個進(jìn)程組號等于pid的絕對值。

kill函數(shù)的成功返回值為0,失敗返回值為-1

此外,調(diào)用kill函數(shù)的進(jìn)程必須有權(quán)限向目標(biāo)進(jìn)程發(fā)送信號。通常,只有root用戶才能向所有進(jìn)程發(fā)送信號,而非root用戶只能向與自己用戶ID相同的進(jìn)程發(fā)送信號

案例

 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <signal.h>
 #include <sys/types.h>
 
  int main()
  {
     pid_t pid;
 
     pid = fork();
     if(pid < 0)
     {
         perror("fail to fork");
         exit(1);
     }
     else if(pid > 0) //父進(jìn)程的代碼區(qū)
    {
         while(1)
         {
             printf("This is parent peocess\n");
             sleep(1);
         }
    }
     else //子進(jìn)程的代碼區(qū) 
    {
     printf("This is son process\n");
     //子進(jìn)程在3秒之后,讓父進(jìn)程退出
    sleep(3);
     //使用kill給父進(jìn)程發(fā)送信號,然后父進(jìn)程接收到信號后直接退出就可以了
    kill(getppid(), SIGINT);
     }
      return 0;
   }

執(zhí)行結(jié)果

kill,alarm,raise,abort,pause,signal等函數(shù)的使用,信號,linux,服務(wù)器,c語言,ubuntu,網(wǎng)絡(luò),windows

?1.2?alarm函數(shù)

alarm函數(shù)是UNIX和類UNIX系統(tǒng)中的一種標(biāo)準(zhǔn)庫函數(shù),它的主要作用是為當(dāng)前進(jìn)程設(shè)置一個定時器。

當(dāng)設(shè)定時間到達(dá)后,定時器會向當(dāng)前進(jìn)程發(fā)送SIGALRM信號。

這個信號的默認(rèn)行為是終止進(jìn)程,但如果進(jìn)程中有一個已注冊的信號處理函數(shù)來處理SIGALRM信號,那么進(jìn)程會根據(jù)該函數(shù)的邏輯來執(zhí)行相應(yīng)的操作

#include <sys/time.h>
unsigned int alarm(unsigned int seconds);

seconds參數(shù)

指定了定時器的超時時間,單位是秒。

如果seconds的值為0,那么之前設(shè)置的定時器會被取消,并且返回之前定時器剩余的時間。

如果seconds的值為-1,那么返回的是0

alarm函數(shù)的返回值有以下幾種情況

  • 如果seconds的值為0,返回值也是0。
  • 如果seconds的值大于0,并且在seconds秒內(nèi)再次調(diào)用了alarm函數(shù)設(shè)置了新的定時器,那么返回值是之前定時器剩余的秒數(shù)。
  • 如果seconds的值大于0,并且沒有在seconds秒內(nèi)再次調(diào)用alarm函數(shù)設(shè)置新的定時器,那么返回值是0

案例

#include <stdio.h>
#include <unistd.h>
#int main()
 {
     unsigned int sec; 

     //當(dāng)執(zhí)行到alarm之后,代碼會接著往下執(zhí)行,當(dāng)設(shè)定的時間到后,會產(chǎn)生SIGALRM信
     //如果alarm之前沒有設(shè)置其他鬧鐘,則返回0,如果之前設(shè)置了,則返回之前剩余的
     //如果一個程序中出現(xiàn)多個alarm鬧鐘,第一個如果沒有到達(dá)指定的時間就遇到第二個
     //則第一個的鬧鐘時間清除,按照第二個alarm鬧鐘的時間繼續(xù)向下運行
     sec = alarm(5);
     printf("sec = %d\n", sec);
     sleep(3);
     sec = alarm(6);
     printf("sec = %d\n", sec);
     while(1)
     {
         printf("hello world\n");
         sleep(1);
     }
     return 0;
}

執(zhí)行結(jié)果

kill,alarm,raise,abort,pause,signal等函數(shù)的使用,信號,linux,服務(wù)器,c語言,ubuntu,網(wǎng)絡(luò),windows

??1.3?raise函數(shù)

raise函數(shù)主要用于向當(dāng)前進(jìn)程發(fā)送一個信號。這個函數(shù)的原型如下:

#include <signal.h>
int raise(int sig);

sig參數(shù)是你想要發(fā)送的信號的名字

。這個函數(shù)的工作原理是,當(dāng)你調(diào)用raise函數(shù)并傳入一個特定的信號名時,它會向當(dāng)前進(jìn)程發(fā)送這個信號

返回值: ?成功:0 ?

????????????????失敗:非0

raise(sig)? 等同于? ?kill(getpid(),?sig)

案例

 #include <stdio.h>
 #include <stdlib.h>
 #include <signal.h>
 #include <unistd.h>
 #include <sys/types.h>
 
  int main(int argc, char const *argv[])
 {
     int num = 0;
 
       while(1)
       {
         printf("hello world\n");
         sleep(1);
         num++;
         //當(dāng)循環(huán)執(zhí)行5秒后,進(jìn)程退出
          if(num == 5)
          {
             //使用raise給當(dāng)前進(jìn)程本身發(fā)送信號
               raise(SIGALRM);
             //等同于kill(getpid(), SIGALRM);
          }
        }
 
     return 0;
  }

執(zhí)行結(jié)果

kill,alarm,raise,abort,pause,signal等函數(shù)的使用,信號,linux,服務(wù)器,c語言,ubuntu,網(wǎng)絡(luò),windows

1.4 abort函數(shù)?

abort函數(shù)是C語言中的一個標(biāo)準(zhǔn)庫函數(shù),其原型定義在<stdlib.h>頭文件中。

該函數(shù)的主要作用是使當(dāng)前的進(jìn)程異常終止,即立即停止當(dāng)前正在執(zhí)行的程序,而不進(jìn)行正常的資源回收和清理工作。

 #include <stdlib.h>
 void abort(void);
 功能:向進(jìn)程發(fā)送一個SIGABRT信號,默認(rèn)情況下進(jìn)程會退出。
   參數(shù):無
 返回值:無

?注意即使SIGABRT信號被加入阻塞集,一旦進(jìn)程調(diào)用了abort函數(shù),進(jìn)程也還是會被終止, 且在終止前會刷新緩沖區(qū),關(guān)閉文件描述符。

案例

  #include <stdio.h>
  #include <stdlib.h>
  #include <signal.h>
  #include <unistd.h>
  #include <sys/types.h>
 
  int main()
  {
     int num = 0;
 
     while(1)
     {
         printf("hello world\n");
         sleep(1);
         num++;
 
        //當(dāng)循環(huán)執(zhí)行5秒后,進(jìn)程退出
          if(num == 5)
          {
             abort();
          }
      }
        return 0;
   }

執(zhí)行結(jié)果

kill,alarm,raise,abort,pause,signal等函數(shù)的使用,信號,linux,服務(wù)器,c語言,ubuntu,網(wǎng)絡(luò),windows

1.5?pause函數(shù)

pause函數(shù)作用是使當(dāng)前進(jìn)程進(jìn)入等待狀態(tài),直到接收到一個信號為止。

這個函數(shù)通常用于等待某個特定的事件發(fā)生,例如等待用戶輸入或者等待某個條件滿足。

#include <sys/wait.h>

int pause(void);

返回值當(dāng)有信號產(chǎn)生時,函數(shù)返回‐1

案例

 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <signal.h>
 #include <sys/types.h>
 
  int main()
  {
     pid_t pid;
     pid = fork();
     if(pid < 0)
     {
        perror("fail to fork");
        exit(1);
     }
     else if(pid > 0) //父進(jìn)程的代碼區(qū)
     {
         printf("This is parent peocess\n");
        //使用pause阻塞等待捕捉信號
         pause();
     }
     else //子進(jìn)程的代碼區(qū) 
     {
         printf("This is son process\n");
         sleep(3);
         kill(getppid(), SIGINT);//睡眠三秒后殺死父進(jìn)程
     }
     
         return 0;
  } 

執(zhí)行結(jié)果

kill,alarm,raise,abort,pause,signal等函數(shù)的使用,信號,linux,服務(wù)器,c語言,ubuntu,網(wǎng)絡(luò),windows

1.6?signal函數(shù)

signal函數(shù)是用于設(shè)置一個特定的信號處理函數(shù)的標(biāo)準(zhǔn)庫函數(shù)。

當(dāng)進(jìn)程接收到一個信號時,signal函數(shù)允許你指定一個函數(shù)來處理這個信號。

 #include <signal.h>
  void (*signal(int sig, void (*func)(int)))(int);
 ‐‐>
 typedef void (*sighandler_t)(int);
 sighandler_t signal(int signum, sighandler_t handler);
  功能:當(dāng)進(jìn)程中產(chǎn)生某一個信號時,對當(dāng)前信號進(jìn)行處理
  參數(shù):
 
  sig:指定要處理的信號
    handler:處理方式
    SIG_IGN 當(dāng)信號產(chǎn)生時,以缺省(忽略)的方式處理
    SIG_DFL 當(dāng)信號產(chǎn)生時,以當(dāng)前信號默認(rèn)的方式處理

func是你想要設(shè)置的信號處理函數(shù)。信號處理函數(shù)必須具有以下形式

void func(int sig);

當(dāng)信號產(chǎn)生時,通過信號處理函數(shù)自定義方式處理,函數(shù)名可以隨便寫,參數(shù)表示當(dāng)前的信號

?返回值: 成功:返回函數(shù)地址,該地址為此信號上一次注冊的信號處理函數(shù)的地址

? ? ? ? ? ? ? ? ?失?。篠IG_ERR

1.6.1??signal函數(shù)的使用

 #include <stdio.h>
 #include <signal.h>
 #include <unistd.h>
 #include <stdlib.h>
 
  void handler(int sig);
 
  int main(int argc, char const *argv[])
{
     //以默認(rèn)的方式處理信號
  #if 0
     if(signal(SIGINT, SIG_DFL) == SIG_ERR)
     {
         perror("fail to signal");
         exit(1);
     }
     if(signal(SIGQUIT, SIG_DFL) == SIG_ERR)
     {
         perror("fail to signal");
         exit(1);
     }
     if(signal(SIGTSTP, SIG_DFL) == SIG_ERR)
     {
         perror("fail to signal");
         exit(1);
     }
  #endif
 
     //以忽略的方式來處理信號
  #if 0
     if(signal(SIGINT, SIG_IGN) == SIG_ERR)
     {
        perror("fail to signal");
         exit(1);
     }
    if(signal(SIGQUIT, SIG_IGN) == SIG_ERR)
     {
        perror("fail to signal");
         exit(1);
     }
     if(signal(SIGTSTP, SIG_IGN) == SIG_ERR)
     {
         perror("fail to signal");
         exit(1);
     }
 
     //注意:SIGKILL和SIGSTOP這兩個信號只能以默認(rèn)的方式處理,不能忽略或者捕捉
    // if(signal(SIGKILL, SIG_IGN) == SIG_ERR)
     // {
     //     perror("fail to signal");
     //     exit(1);
     // }
 
  #endif    

     //以用戶自定義方式處理信號
 #if 1
     if(signal(SIGINT, handler) == SIG_ERR)
     {
         perror("fail to signal");
         exit(1);
     }
     if(signal(SIGQUIT, handler) == SIG_ERR)
     {
         perror("fail to signal");
         exit(1);
     }
     if(signal(SIGTSTP, handler) == SIG_ERR)
     {
         perror("fail to signal");
         exit(1);
     }
 #endif  

     while(1)
     {
         printf("hello world\n");
         sleep(1);
     }
         return 0;
}
  

  void handler(int sig)
  {
     if(sig == SIGINT)
     {
         printf("SIGINT正在處理\n");
     }
 
     if(sig == SIGQUIT)
     {
        printf("SIGQUIT正在處理\n");
     }
 
     if(sig == SIGTSTP)
     {
         printf("SIGTSTP正在處理\n");
     }
  }

在使用signal函數(shù)時,還需要考慮信號處理的同步和互斥問題,以確保程序的正確性和穩(wěn)定性文章來源地址http://www.zghlxwxcb.cn/news/detail-856351.html

到了這里,關(guān)于kill,alarm,raise,abort,pause,signal等函數(shù)的使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Linux中的alarm和setitimer定時器函數(shù)以及信號捕捉函數(shù)signal和sigaction

    Linux中的alarm和setitimer定時器函數(shù)以及信號捕捉函數(shù)signal和sigaction

    通過 man 2 alarm 查看alarm函數(shù)的詳細(xì)信息。 功能: 設(shè)置定時器(鬧鐘)。從調(diào)用這個函數(shù)開始進(jìn)行倒計時,倒計時結(jié)束之后(變?yōu)?),函數(shù)會給當(dāng)前的進(jìn)程發(fā)送 SIGALARM 信號。 參數(shù): seconds: 倒計時的時長,單位:秒。如果參數(shù)為0,定時器無效(不進(jìn)行倒計時,不發(fā)信號)。取

    2024年02月03日
    瀏覽(17)
  • linux 信號原理 信號處理設(shè)置signal, 信號發(fā)送kill,信號等待sigsuspend,信號阻塞sigprocmask,一網(wǎng)打盡信號使用

    linux 信號原理 信號處理設(shè)置signal, 信號發(fā)送kill,信號等待sigsuspend,信號阻塞sigprocmask,一網(wǎng)打盡信號使用

    ? 專欄內(nèi)容 : postgresql內(nèi)核源碼分析 手寫數(shù)據(jù)庫toadb 并發(fā)編程 個人主頁 :我的主頁 座右銘:天行健,君子以自強不息;地勢坤,君子以厚德載物. ================================ 信號是一種軟中斷的方式,讓進(jìn)程陷入中斷處理調(diào)用中; linux 下信號也是一種進(jìn)程間通信的手段;進(jìn)

    2024年02月13日
    瀏覽(25)
  • 【Linux系統(tǒng)編程】26.信號、kill、alarm、setitimer

    【Linux系統(tǒng)編程】26.信號、kill、alarm、setitimer

    目錄 信號 信號共性 信號特質(zhì) 產(chǎn)生信號 信號相關(guān)概念 默認(rèn)處理動作 信號4要素 常規(guī)信號 ??編輯 注意 kill 參數(shù)pid 測試代碼1 測試結(jié)果 測試代碼2 測試結(jié)果 alarm 參數(shù)seconds 返回值 取消鬧鐘 測試代碼3 測試結(jié)果1 測試結(jié)果2 ??編輯 setitimer 參數(shù)which 參數(shù)new_value 參數(shù)old_value 測試

    2024年04月28日
    瀏覽(13)
  • Linux系統(tǒng)調(diào)用之signal,sigaction函數(shù) (捕捉指定的信號,自定義/默認(rèn)處理該信號)

    如果,想要深入的學(xué)習(xí)Linux系統(tǒng)調(diào)用中的signal,sigaction函數(shù),還是需要去自己閱讀Linux系統(tǒng)中的幫助文檔。 具體輸入命令: 即可查閱到完整的資料信息。 signal()是一個用于處理Unix和類Unix操作系統(tǒng)(如Linux)中的信號的系統(tǒng)調(diào)用。信號是用于在進(jìn)程間或者進(jìn)程內(nèi)部傳遞通知或者

    2024年02月02日
    瀏覽(32)
  • 【TCP/IP】多進(jìn)程服務(wù)器的實現(xiàn)(進(jìn)階) - 信號處理及signal、sigaction函數(shù)

    【TCP/IP】多進(jìn)程服務(wù)器的實現(xiàn)(進(jìn)階) - 信號處理及signal、sigaction函數(shù)

    目錄 信號 signal函數(shù) sigaction函數(shù) 用信號來處理僵尸進(jìn)程 ???????? 在之前我們學(xué)習(xí)了如何處理“僵尸進(jìn)程”,不過可能也會有疑問:調(diào)用wait和waitpid函數(shù)時我們關(guān)注的始終是在子進(jìn)程上,那么在父進(jìn)程上如何實現(xiàn)對子進(jìn)程的管控呢?為此,我們引入一個概念——信號處理。

    2024年02月08日
    瀏覽(19)
  • RuntimeError: DataLoader worker is killed by signal: Killed.報錯解決

    一、問題描述 使用pytorch進(jìn)行訓(xùn)練時,訓(xùn)練了僅幾個batch后出現(xiàn)報錯信息: 這個報錯和DataLoader有關(guān),定位到訓(xùn)練腳本中的代碼: 二、問題分析 通過設(shè)置num_workers,DataLoader實例可以使用多少個子進(jìn)程進(jìn)行數(shù)據(jù)加載,從而加快網(wǎng)絡(luò)的訓(xùn)練過程。 默認(rèn)情況下,num_workers值被設(shè)置為

    2024年02月12日
    瀏覽(20)
  • MongoDB 啟動提示錯誤code=killed, signal=ABRT

    MongoDB 啟動提示錯誤code=killed, signal=ABRT

    如果不賦權(quán)限,啟動的時候則會提示 啟動成功!

    2024年02月03日
    瀏覽(21)
  • 【genius_platform軟件平臺開發(fā)】第九十七講:linux設(shè)備驅(qū)動中信號(signal函數(shù))的異步通知機制

    【genius_platform軟件平臺開發(fā)】第九十七講:linux設(shè)備驅(qū)動中信號(signal函數(shù))的異步通知機制

    意思是: 一旦設(shè)備就緒,則主動通知應(yīng)用程序 ,這樣應(yīng)用程序根本就不需要查詢設(shè)備狀態(tài),這一點非常 類似于硬件上“中斷”的概念 ,比較準(zhǔn)確的稱謂是“ 信號驅(qū)動的異步I/O ”。信號是在軟件層次上對 中斷機制的一種模擬 ,在原理上,一個進(jìn)程收到一個信號與處理器收到一

    2024年02月08日
    瀏覽(26)
  • collect2: fatal error: ld terminated with signal 9 [Killed]

    在 WSL2 中編譯 LLVM遇到了如下報錯: collect2: fatal error: ld terminated with signal 9 [Killed] 經(jīng)過查詢,發(fā)現(xiàn)是因為內(nèi)存不足,造成進(jìn)程被killed。 默認(rèn)WSL2 的內(nèi)存是主機內(nèi)存的50%或者8GB。因此提高內(nèi)存上限即可。如果主機內(nèi)存有限,可以增大swap的大小。默認(rèn) swap大小為內(nèi)存的25%。 WSL2 的

    2024年02月15日
    瀏覽(23)
  • LLVM編譯報錯解決:collect2: fatal error: ld terminated with signal 9 [Killed]

    克隆代碼到本地 配置編譯選項 generator一般使用Ninja,而 options 中必須要傳入的參數(shù)是構(gòu)建類型 CMAKE_BUILD_TYPE 不同的CMAKE_BUILD_TYPE區(qū)別如下: Build Type Optimization Debug Info Assertion Release For Speed No No Debug None Yes Yes RelWithDebInfo For Speed Yes No MinSizeRel For Size No No Release適合LLVM和Clang的用戶

    2024年02月11日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包