1-父程序fork出子程序c1,c2,c3,和d1,需要子程序c1,c2,c3同時執行或者子程序d1單獨執行。
2-子程序c1,c2,c3呼叫相同的函式,只是傳入的引數不同。子程序d1呼叫與之不同的函式。
3-使用訊號量(pv操作)來解決此問題。
初始化訊號量的值為3,在執行子程序d1時,進行pv操作,將訊號量的值先-3,子程序d1執行完成後將訊號量的值+3,而在執行子程序c1,c2,c3時,由於呼叫相同的函式,可以在進行pv操作時,將訊號量的值先-1,執行完成後將訊號量的值+1,就可以解決。測試用例和測試結果如下:
#include
#include
#include
#include
#include
#include
#include
int sem_id;
key_t sem_key;
/* 建立訊號量 */
intinitsem
(int
*semid, key_t semkey)
else
res =
semctl
(*semid,
0, setval,3)
;if(*semid ==-1
|| res ==-1
)else
return0;
}/* v 操作 */
intv
(int semid,
int flag,
short value)
return0;
}/* p 操作 */
intp
(int semid,
int flag,
short value)
return0;
}void
same_handle
(int value)
void
oneself_handle
(int value)
intmain
(void);
/* 初始化訊號量 */
initsem
(&sem_id, sem_key);
pid[0]
=fork()
;if(pid[0]
==0) pid[1]
=fork()
;if(pid[1]
==0) pid[2]
=fork()
;if(pid[2]
==0) pid[3]
=fork()
;if(pid[3]
==0)while(1
);while(1);}
測試結果:
首先,子程序d1執行,獲得訊號量,當前訊號量值為0,子程序c1,c2,c3阻塞,當d1執行完事後,變成殭屍程序,子程序c1,c2,c3同時獲得訊號量開始執行,最後同時退出變成殭屍程序。
由此可見,訊號量在程序之間起著互斥、同步的作用,可以達到很好的效果。
解決john不能開多個程序的問題
在使用john進行shadow檔案破解時,如果已經開了乙個john的程序,這回提示以下錯誤 crash recovery file is locked root john john.rec 意思是 root john john.rec檔案被鎖定。通過測試只要把 root john john.rec這...
單車道問題 程序同步互斥與死鎖問題的解決
一 同步互斥關係 在這條南北雙向的國家公路和共享單車道的隧道上,存在如下的同步互斥關係 1 同乙個車道上,前面的車沒有前進,則後面的車不能前進 2 對於每一輛將進入隧道的車,只有沒有迎面而來的汽車時才能使用隧道。因此,設定 6個感測器和 2個訊號燈,如下圖所示 感測器a b c和d e f 分別用於...
作業系統互斥程序問題
假設有n個程序,共享乙個空間 1 當共享區只允許乙個程序占用時候,則訊號量 mutex 的取值範圍 2共享區允許m個程序占用,訊號量取值範圍 1,互斥訊號量初值為 1 變化範圍為 n l 1 當沒有程序進入互斥段時,訊號量值為 1 當有 1 個程序進入互斥段但沒有程序等待進入互斥段時,訊號量值為 0...