c 5 程序的訊號處理

2021-08-20 10:36:31 字數 2551 閱讀 8595

1)訊號處理

捕獲訊號

輸出:^c

3811程序:收到2訊號

#include #include #include #include #include //定義訊號處理函式

void sigint(int signum)

int main()

sleep(10);//睡眠10秒,期間等待使用者按下ctrl+c以收到訊號

return 0;

}

fork/vfork函式建立的子程序會繼承父程序的訊號處理方式,直到子程序呼叫exec函式建立新程序替代其自身。

exec函式建立的新程序會將原程序中被設定為捕獲的訊號還原為預設操作,畢竟位於原程序位址空間中的訊號處理函式,此時已經被新程序的位址空間完全取代了。

訊號處理的繼承

輸出:這是父程序,pid=4179

這是子程序,pid=4180父程序的pid=4179

^c-341902544程序,收到-341902848訊號-341902544程序,收到-341902848訊號

#include #include #include #include #include //定義訊號處理函式sigint 

void sigint(int signum)

int main()

pid_t pid;

if((pid=fork())<0)

perror("fork");

else if(pid==0)

else

printf("這是父程序,pid=%d\n",getpid());

sleep(10);

return 0;

}

訊號處理的恢復

輸出:execl: no such file or directory

#include #include #include #include #include void sigint(int signum)

int main(void)

if(execl("foo","foo",null)==-1)

sleep(10);

return 0;

}

2)殺死程序

在子程序中殺死父程序

輸出:這是父程序,pid=2364

這是子程序,pid=2365,父程序的pid=2365

按回車鍵,終止父程序

^c[按回車沒反應,不知原因]

#include #include #include #include int main()

else if(pid==0)

else

return 0;

}

程序自殺

int raise(int sig);

輸出:按回車鍵,終止程序

已終止

#include #include #include #include int main()

3)暫停

int pause(void);

使用函式pause使當前程序無限睡眠,當有訊號被當前程序捕獲,當訊號處理函式返回以後,pause函式返回,返回值為-1,同時置errno為sig_err,表示阻塞的系統呼叫被訊號中段。pause函式要麼不返回,要麼返回失敗,不會返回成功。

輸出:按ctrl+c繼續

^c中斷符訊號被傳送

程序繼續

#include #include #include #include #include void sigint(int signum)

int main()

printf("按ctrl+c繼續\n");

if(pause()==-1 && errno!=eintr)

printf("程序繼續\n");

return 0;

}

睡眠unsigned int sleep(unsigned int seconds);

使用函式sleep使當前程序睡眠60秒,除非使用者按下ctrl+c傳送中斷訊號被其捕獲,如果有訊號被呼叫程序捕獲,在訊號處理函式返回以後,sleep函式才會返回,且返回值為剩餘的秒數,否則該函式將返回0,表示睡眠充足。

輸出:按ctrl+c繼續,或等待程序睡足1分鐘。

^c中斷符訊號被傳送

程序被提前57秒叫醒

程序繼續

#include #include #include #include #include void sigint(int signum)

int main(void)

printf("按ctrl+c繼續,或等待程序睡足1分鐘。\n");

int alarm=sleep(60);

if(alarm)

printf("程序被提前%d秒叫醒\n",alarm);

printf("程序繼續\n");

return 0;

}

Linux程序訊號 訊號處理

一 訊號相關概念 1.實際執行訊號的處理動作稱為訊號遞達 delivery 2.訊號從產生到遞達之間的狀態稱為訊號未決 pending 不一定會立即delivery 3.程序可以選擇阻塞 block 某個訊號。不會遞達 4.被阻塞的訊號產生時將保持在未決狀態,知道程序解除對此訊號 的阻塞,才會執行遞...

C 5純屬YY的展望

每次.net出現新版本後,都會有大量對下個版本不靠譜的各種yy。尤其是c 一些yy會從3開始,直到5。在這裡我也不妨yy一下,談談我期盼了很久的一些語言特性,我盡可能會讓這些yy靠譜一點,各位看官姑妄聽之,姑妄看之。1 namespace語句 namespace ivony 令整個檔案所有根定義,均...

程序對訊號的處理

朱老師物聯網大講堂 學習筆記 signal函式,處理訊號,include typedef void sighandler t int sighandler t signal int signum,sighandler t handler include include include typedef...