解決linux多個程序互斥問題

2021-10-04 12:50:07 字數 1774 閱讀 4214

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...