關於名字,老師課件上寫訊號量,實驗教材上卻寫訊號燈。這種概念,叫來叫去的概念的東西適合不去理解東西的女生去背。然後覺得知道的東西很多一樣每次都說其中乙個時都把另乙個名字也說出來。
我喜歡通俗的理解一下,在前兩遍的時候沒有什麼概念,這次就仔細找生活中的概念。我想起來我坐過的火車,那上邊的衛生間,目前沒坐過硬座以外的火車,就拿我見過的來說吧。衛生間絕對算是乙個臨界資源了,這個很好理解,它就乙個xx,所以一次只能乙個人(程序)上(訪問)。
那個能亮「有人」的指示燈的作用就很好理解,沒人的時候是不亮的,有人的時候立即顯示「有人」。其它人就不能訪問。這不就是乙個活生生的訊號量例子。那一車廂的人就是程序,他們都要上乙個只能乙個人同時上的衛生間。
同樣在火車上上廁所也能總結出步驟來:1建好廁所和指示燈 2將燈設為無人狀態 3一人進廁所 燈顯示為「有人」狀態 4 方便完 出來 燈重新顯示為「無人」狀態 5 拆出廁所和指示燈。其實上邊的第一步和第五步是為了引到訊號量中硬套上去的,沒有人會這樣做。
根據火車上上廁所的經歷,訊號量的作用和用法都出來了。
比喻完了,就該說點正經的,在沒學習這個的時候就在mini2440的adc驅動和tc驅動之間看到了訊號量的蹤跡。但是那是驅動程式,那也算是程序嗎?這都還是未解的。
在這期間老師給我舉了乙個高雅的例子:印表機。不過意思是相同的。
看乙個例子:test.c
#include #include #include #include #include #include #include #include int main()
printf("ftok ok, semkey = %d\n", semkey);
if((semid = semget(semkey, 1, ipc_creat|ipc_excl|0700))<0)
printf("semget ok, semid=%d\n", semid);
if((semctl(semid, 0, setval, 1))<0)
printf("semctl set semval ok\n");
if((pid = fork())<0)
else if(pid>0)
printf("father get the semaphore\n");
v_op_buf.sem_num = 0;
v_op_buf.sem_op = 1;
v_op_buf.sem_*** = 0;
if(semop(semid, &v_op_buf, 1)<0)
wait(null);
} else
printf("child get the semaphore\n");
if(semctl(semid, 0, ipc_rmid, 0)< 0)
} return 0;
}
執行結果:
[root@localhost desktop]# ./a.out
ftok ok, semkey = 16795729
semget ok, semid=163843
semctl set semval ok
father get the semaphore
child wait for the semaphore
child get the semaphore
[root@localhost desktop]#
在做完這個例子後我其實不能明白這個在這裡邊的作用,乙個程序獲取一下然後釋放。另乙個程序同樣這樣做。真沒有什麼意思。但是我想到了 adc 和 tc的例子。它們只是同時要用,然後訊號量就有了,又但是不是說只讓乙個用,而不讓另乙個用,而是做乙個調解。讓乙個程序用一下。再讓另乙個用一下,這樣就不會造成某個程序不能用這個資源 了,上邊的程式執行一次真沒有什麼意思。如果多次意思就出來了。
另外關於 計數訊號燈 這個現實中的例子莫過於是乙個生意很好的飯店中的空的桌子的數量了,人特別多,都在外邊排隊,50張桌子遞減,來一桌人就減一,到0的時候就不能再進人了,如果走一桌又從0+1=1了,就可以再進一桌人了。這個資源是可以這樣來的。
**:
程序間通訊方式 訊號量(Semaphore)
include include includeint semget key t key,int nsems,int flags 返回 成功返回訊號集id,出錯返回 1 int semctl int semid,int semnum,int cmd,union semun int semop int ...
IPC 程序間通訊方式 訊號量
includestruct semid ds include int semget key t key,int nsems,int flag 返回 如果成功,返回訊號量集id,出錯返回 1 若建立訊息佇列,key可以指定鍵值,也可以設定為ipc private 0 若開啟進行查詢,則key不能為0,...
程序間通訊 訊號量
ipc識別符號和關鍵字 在終端輸入ipcs,可以看到目前系統中所有的ipc資訊 第一列的key就是ipc的關鍵字,第二列是ipc的識別符號。ftok 函式用於獲得乙個ipc的關鍵字,其函式原型是 key t ftok const char pathname,int proj id 下面是乙個訊號量的...