Linux技術 訊號

2021-10-05 06:20:35 字數 4576 閱讀 7300

目的

①使用vi編輯程式,該程式可啟動乙個父程序和5個子程序,且父子程序都一直處於執行態。

②執行上述程式,使用kill命令對該程式建立的程序執行掛起、終止等操作。

③使用kill命令對該程式建立的整個程序組中的程序進行操作。

①編寫程式,在程式中通過設定程序的訊號集,遮蔽3號訊號sigqiut,並在迴圈中不斷

列印訊號集中訊號的狀態。

②編寫程式,在程式中通過signal()函式遮蔽3號訊號sigqiut。

①編寫程式,在程式中通過signal()函式捕獲7號訊號sigbus,若成功捕獲,

則列印「catch sigbus」。

②編寫程式,在程式中通過sigaction()函式捕獲7號訊號sigbus,若成功捕獲,

則列印「catch sigbus」。

③編寫程式,實現父子間程序同步,要求子程序等待父程序執行完畢後再結束執行。

編寫程式,在程式中實現sleep()函式的功能,並通過自定義的sleep()函式使

程序沉睡一定時間,沉睡結束後列印「x seconds passed\n」。

編寫程式,在程式中建立多個子程序,使父程序利用訊號機制,非阻塞地**所

有子程序。

1、kill命令

使用vi編輯程式,在程式中建立多個子程序,並保證程式啟動後建立的

父子程序能一直執行。

1	#include 2	#include 3	#include 4	#include 5	int main()

6

14 if(pid<0)

18 else if(pid==0)

20 }

21 else if(pid>0)

23 }

24 return 0;

25 }

編譯程式test_kill.c並執行,在終端通過kill命令對其啟動的程序進行操作。
gcc test_kill.c –o test_kill ——編譯程式

./test_kill & ——在後台執行

ps ao stat,pid,pgrp,command | grep ./test_kill

——檢視test_kill啟動的程序,依次列印狀態、pid、程序組id和

啟動程序的命令,列印結果如下:

使用「ps ao stat,pid,pgrp,command | grep ./test_kill」命令,列印結果如下:

kill -1 3912 ——傳送1號訊號到3912

kill -2 3913 ——傳送2號訊號到3913

kill -19 3914 ——傳送19號訊號到3914

使用「ps ao stat,pid,pgrp,command | grep ./test_kill」命令,列印結果如下:

傳送訊號到程序組3911,此時使用「ps ao stat,pid,pgrp,command | grep ./test_kill」

命令,列印結果如下:

——傳送訊號到程序組3911,此時使用「ps ao stat,pid,pgrp,command | grep ./test_kill」

命令,列印結果如下:

2、 遮蔽指定訊號,實現訊號阻塞

1 編寫程式,在程式中通過設定程序的訊號集,遮蔽3號訊號sigquit,

並在迴圈中不斷列印訊號集中訊號的狀態。

預備知識: sigemptyset()、sigfillset()、sigaddset()、sigdelset()、sigismember()。

1	#include 2	#include 3	#include 4	#include 5	void printset(sigset_t *ped)

6

15 printf("\n");

16 }

17 int main()

18 28 return 0;

29 }

編譯程式並執行,通過快捷鍵組合ctrl+\傳送3號訊號到程序,程式的執行結果如下:

ctril+c才能終止程式。

② 編寫程式,在程式中通過signal()函式遮蔽3號訊號sigquit。

通過signal()函式實現訊號遮蔽

預備知識:signal()函式

捕獲指定訊號,執行自定義的訊號處理函式

``寫程式,在程式中通過signal()函式捕獲7號訊號sigbus,若成功捕獲,則列印「catch sigbus」。

1	#include 2	#include 3	#include 4	#include 5	void func(int signo)

6 10 int main()

11 18 return 0;

19 }

編寫程式,在程式中通過sigaction()函式捕獲2號訊號sigint,若成功捕獲

,則列印「catch sigint」。

1	#include 2	#include 3	#include 4	#include 5	

6 void func(int signo)

7 12 }

13 int main()

14 26 return 0;

27 }

編寫程式,實現父子間程序同步,要求父程序中使用迴圈列印3次提示資訊,

子程序等待父程序中的提示資訊列印完畢後再結束執行。

預備知識:signal()函式、kill()函式

1	#include 2	#include 3	#include 4	#include 5	#include 6	int k1; 

7 void func1(int signo)

8 12 int main()

13 23 kill(p1,12);

24 wait(0);

25 printf("ok!\n");

26 exit(0);

27 }

28 else

29

37 printf("child exited!\n");

38 exit(0);

39 }

40 return 0;

41 }

使用sigsuspend()函式解決時序競態問題

編寫程式,在程式中實現sleep()函式的功能,並通過自定義的sleep()函式使程序沉睡一定時間,

沉睡結束後列印「x seconds passed\n」。

預備知識:alarm()函式、sigsuspend()函式

1	#include 2	#include 3	#include 4	#include 5	

6 void sig_alrm(int signo)

7 11 unsigned int mysleep(unsigned int seconds)

12 32 int main()

33 38 return 0;

39 }

使用sigchld訊號實現多個子程序的**

編寫程式,在程式中建立多個子程序,使父程序利用訊號機制,非阻塞地**所有子程序。

預備知識:fork()、sigaction()函式

1	#include 2	#include 3	#include 4	#include 5	#include 6	void sys_err(char *str)

7 11 void do_sig_child(int signo) //訊號處理函式

12

21 }

22 int main(void)

23 32 if (pid == 0)

38 return i + 1;

39 }

40 else if (pid > 0)

50 }

51 return 0;

52 }

linux訊號 阻塞訊號

1.訊號在核心中的表示 我們知道了訊號產生的各種原因,而實際執行訊號處理的動作,叫做訊號遞達 delivery 訊號從產生到遞達之間的狀態,稱為訊號未決 pending 程序可以選擇阻塞 block 某個訊號。被阻塞的訊號產生時將保持在未決狀態,直到程序解除對此訊號的阻塞,才執行遞達的動作。注意,阻...

Linux程序訊號 訊號處理

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

Linux入門 訊號(二) 阻塞訊號

實際執行訊號的處理動作稱為訊號遞達 delivery 訊號從產生到遞達之間的狀態,稱為訊號未決 pending 程序可以選擇阻塞 block 某個訊號。被阻塞的訊號產生時將保持在未決狀態,直到程序接觸對此訊號的阻塞,才執行遞達的操作。阻塞和忽略不同,只有訊號阻塞就不會遞達,而忽略是在訊號遞達之後可選...