目的
①使用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 某個訊號。被阻塞的訊號產生時將保持在未決狀態,直到程序接觸對此訊號的阻塞,才執行遞達的操作。阻塞和忽略不同,只有訊號阻塞就不會遞達,而忽略是在訊號遞達之後可選...