⑴ linux 中有名信號量,異常關閉其他線程如何獲取
linux下進程間同步的機制有以下三種:
信號量
記錄鎖(文件鎖)
共享內存中的mutex
效率上 共享內存mutex > 信號量 > 記錄鎖
posix 提供了新的信號量 - 有名信號量,既可以使用在進程間同步也可以作為線程間同步的手段。效率比共享內存mutex要好一些
⑵ linux進程間信號量的調試信號
命令 ipcs -s 可以顯示系統中現有的信號量組的相關信息。而 ipcrm sem 命令可以從命令行刪除一個信號量組。例如,要刪除標識符為5790517的信號量組則應運行以下命令:
% ipcrm sem 5790517
⑶ linux 查看信號量 哪個進程
sem_init:初始化信號量sem_t,初始化的時候可以指定信號量的初始值,以及是否可以在多進程間共享。 sem_wait:一直阻塞等待直到信號量>0。 sem_timedwait:阻塞等待若干時間直到信號量>0。 sem_post:使信號量加1。 sem_destroy:釋放信號量。...
⑷ linux編程時的信號量問題。 我以前用過的信號量頭文件是<semaphore.h>,而現在又發現還有個<sys/sem.h>
semaphore.h 提供的是 POSIX 標準定義的 semaphore 介面 ( sem_open, sem_wait, ...) ,這組介面使用更簡單,設計的較好。
而 sys/sem.h 里 提供的是符合 System V 標準的 semaphore介面 (semget, semop, ...),這些介面都比較老了, linux提供主要是為了兼容老代碼。
對於 linux 開發來說,新寫的代碼,都應該考慮採用 POSIX 標準的信號量。
⑸ linux 信號量是什麼怎麼用
Linux信號量(semaphore)是一種互斥機制。即對某個互斥資源的訪問會收到信號量的保護,在訪問之前需要獲得信號量。
在操作完共享資源後,需釋放信號量,以便另外的進程來獲得資源。獲得和釋放應該成對出現。
獲得信號量集,需要注意的是,獲得的是一個集合,而不是一個單一的信號量。
#include
#include
#include
1: int semget(key_t key,int nsems,int semflg);
key:系統根據這個值來獲取信號量集。
nsems:此信號集包括幾個信號量。
semflg:創建此信號量的屬性。 (IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR)
成功則返回該信號量集的ID。
註:
既指定IPC_CREAT又指定IPC_EXCL時,如果系統中該信號量集已經存在,則馬上返回。
如果需要獲得存在的信號量,則將此參數置0.
2: int semctl(int semid,int senum,int cmd....)
semid:信號量ID。
senum:對信號量集中的第幾個信號量進行控制。(從0開始)
cmd:需要進行的操作。(SETVAL是其中的一個)。
根據cmd的不同可能存在第四個參數,cmd=SETVAL時,表示同時信號量可以被獲得幾次,如第四個參數
num=1表示只能被獲得一次,既被信號量保護的資源只能同時被一個程序使用。
該系統調用,是在對信號量初始化時用的。
-3: 「3」前面加了"-"表示當需要使用互斥資源時應該做這步。
int semop(int semid,struct sembuf *sem,int num_elements);
struct sembuf {
unsigned short sem_num; //該信號量集中的第幾個信號量。
int sem_op;//需要獲得還是釋放信號量
int sem_flg;//相關動作
};
num_elements:需要對該信號量集中的多少個信號量進行處理。
獲得信號量時,將sembuf結構提初始化為:
sem_num = 0; //該信號量集中的首個信號量
sem_op = -1; //獲得信號量
sem_flag = IPC_NOWAIT; //如果不能獲得信號量,馬上返回。
semop(semid,_sem,1);
同理釋放信號量時,將sem_op設為1.
以上是對信號量的簡單處理
⑹ linux 怎麼查 信號量 被進程p住
這篇文章將講述別一種進程間通信的機制——信號量。注意請不要把它與之前所說的信號混淆起來,信號與信號量是不同的兩種事物。有關信號的更多內容,可以閱讀我的另一篇文章:Linux進程間通信——使用信號。下面就進入信號量的講解。
一、什麼是信號量
為了防止出現因多個程序同時訪問一個共享資源而引發的一系列問題,我們需要一種方法,它可以通過生成並使用令牌來授權,在任一時刻只能有一個執行線程訪問代碼的臨界區域。臨界區域是指執行數據更新的代碼需要獨占式地執行。而信號量就可以提供這樣的一種訪問機制,讓一個臨界區同一時間只有一個線程在訪問它,也就是說信號量是用來調協進程對共享資源的訪問的。
信號量是一個特殊的變數,程序對其訪問都是原子操作,且只允許對它進行等待(即P(信號變數))和發送(即V(信號變數))信息操作。最簡單的信號量是只能取0和1的變數,這也是信號量最常見的一種形式,叫做二進制信號量。而可以取多個正整數的信號量被稱為通用信號量。這里主要討論二進制信號量。
二、信號量的工作原理
由於信號量只能進行兩種操作等待和發送信號,即P(sv)和V(sv),他們的行為是這樣的:
P(sv):如果sv的值大於零,就給它減1;如果它的值為零,就掛起該進程的執行
V(sv):如果有其他進程因等待sv而被掛起,就讓它恢復運行,如果沒有進程因等待sv而掛起,就給它加1.
舉個例子,就是兩個進程共享信號量sv,一旦其中一個進程執行了P(sv)操作,它將得到信號量,並可以進入臨界區,使sv減1。而第二個進程將被阻止進入臨界區,因為當它試圖執行P(sv)時,sv為0,它會被掛起以等待第一個進程離開臨界區域並執行V(sv)釋放信號量,這時第二個進程就可以恢復執行。
三、Linux的信號量機制
Linux提供了一組精心設計的信號量介面來對信號進行操作,它們不只是針對二進制信號量,下面將會對這些函數進行介紹,但請注意,這些函數都是用來對成組的信號量值進行操作的。它們聲明在頭文件sys/sem.h中。
⑺ linux常用信號量
linux的常用信號量
BUS與SEGV
二者都是錯誤信號,BUS表示匯流排錯誤,SEGV表示段錯誤,程序崩潰的時候99%都是這兩個錯誤導
致的。進程可以捕獲和封鎖這兩類錯誤。內核對二者的默認處理是memory mp
WINCH
窗口改變信號(WINdown CHanged)。例如虛擬終端的行數發生變化時將發送WINCH信號,絕大多數
文本編輯器都能捕獲WINCH信號自動進行重新配置。內核的默認處理是忽略該信號,並且不進行內存
轉儲。
進程可以捕獲或者封鎖該信號
KILL
殺死/刪除進程,編號為9
STOP
掛起/暫停正在執行的進程,直到收到CONT為止
KILL STOP都不能夠被捕獲、封鎖或者忽略,默認處理都不會產生內存轉儲。
CONT
取消掛起,繼續執行進程
TSTP
是STOP信號的「軟」版本,即在用戶輸入Ctrl+Z時由終端驅動程序發送的信號。捕獲到該信號的進程通常
清除它們的狀態,如何給自己發送一個STOP信號。TSTP的默認處理不會導致內存轉儲。
INT
中斷信號,編號為2
當用戶輸入Ctrl+C時由終端驅動程序發送INT信號
INT信號是終止當前操作的請求,簡單程序捕獲到INT信號時應該退出,擁有命令行或者輸入模式的那些
程序應該停止他們正在做的事情,清除狀態,並等待用戶再次輸入。
TERM
軟體終止信號,編號為15
TERM是請求徹底終止某項操作的信號,它期望進程清楚自己的狀態並退出
QUIT
退出信號,編號為3
與TERM類似,不同之處在於QUIT信號的默認處理是內存轉儲,而TERM信號的默認處理沒有內存轉儲。
HUP
掛起信號,編號為1,有兩種解釋:
守護進程理解HUP為重新設置的請求,如果守護進程能夠不用重新啟動就能夠重新讀取它自己的配置文
件並調整自己以適應變化的話,那麼HUP信號通常可以用來觸發這種行為
HUP
信號有時有終端驅動程序生成,試圖用來清除(也就是終止)跟某個特定終端相連接的那些進程。例如
當一個終端會話結束時,或者當一個Modem的連接不經意的斷開時,就可能出現這種情況。
如果需要某些進程在會話結束之後繼續運行,那麼在C Shell中設法讓這些進程變成後台程序,
ksh或者bash中可以用nohup來模擬這種行為。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
進程的四種狀態
runnable(可運行狀態)
只要有CPU時間,進程就可以執行。一旦進程執行了不能立即完成的系統調用,Linux會把進程轉入
睡眠狀態
sleeping(睡眠狀態)
進程在等待某些事件發生(如終端輸入、網路連接)
zombie(僵化狀態)
進程已經執行完畢並試圖消亡,但是狀態沒有收集完
stopped(停止狀態)
進程被掛起,不允許執行。進程收到STOP或者TSTP信號即進入停止狀態,可以用CONT信號來重新啟動
⑻ linux 在哪個文件下查看信號列表
通過命令+文件名查看內容。如下命令可以查看。 1, cat :由第一行開始顯示文件內容; 2,tac:從最後一行開始顯示,可以看出tac與cat字母順序相反; 3,nl:顯示的時候輸出行號; 4,more:一頁一頁的顯示文件內容;
⑼ linux 判斷有明信號量是否已經創建
sem_init:初始化信號量sem_t,初始化的時候可以指定信號量的初始值,以及是否可以在多進程間共享。 sem_wait:一直阻塞等待直到信號量>0。 sem_timedwait:阻塞等待若干時間直到信號量>0。 sem_post:使信號量加1。 sem_destroy:釋放信號量。...
⑽ linux信號量的問題
sem_init:初始化信號量sem_t,初始化的時候可以指定信號量的初始值,以及是否可以在多進程間共享。
sem_wait:一直阻塞等待直到信號量>0。
sem_timedwait:阻塞等待若干時間直到信號量>0。
sem_post:使信號量加1。
sem_destroy:釋放信號量。和sem_init對應。 答案補充 關於各函數的具體參數請用man查看,如man sem_init可查看該函數的幫助