信號量是一個特殊的變量,程序?qū)ζ湓L問都是原子操作,且只允許對它進(jìn)行等待(即 P(信號變量))和發(fā) 送(即 V(信號變量))信息操作。最簡單的信號量是只能取 0 和 1 的變量,這也是信號量最常見的一種形式, 叫做二進(jìn)制信號量。而可以取多個正整數(shù)的信號量被稱為通用信號量。這里主要討論二進(jìn)制信號量。 由于信號量只能進(jìn)行兩種操作等待和發(fā)送信號,即 P(sv)和 V(sv),他們的行為是這樣的: P(sv):如果 sv 的值大于零,就給它減 1;如果它的值為零,就掛起該進(jìn)程的執(zhí)行 V(sv):如果有其他進(jìn)程因等待 sv 而被掛起,就讓它恢復(fù)運(yùn)行,如果沒有進(jìn)程因等待 sv 而掛起,就給它加 1。
信號燈也叫信號量,它能夠用來同步進(jìn)程的動作,不能傳輸數(shù)據(jù)。它的應(yīng)用場景就像紅綠燈,控制各 進(jìn)程使用共享資源的順序。Posix 無名信號燈用于線程同步, Posix 有名信號燈,System V 信號燈。信號燈 相當(dāng)于一個值大于或等于 0 計數(shù)器,信號燈值大于 0,進(jìn)程就可以申請資源,信號燈值-1,如果信號燈值為 0,一個進(jìn)程還想對它進(jìn)行-1,那么這個進(jìn)程就會阻塞,直到信號燈值大于 1
使用 System V 信號量的步驟如下:
1. 使用 semget()創(chuàng)建或打開一個信號燈集。
2. 使用 semctl()初始化信號燈集,。
3. 使用 semop()操作信號燈值,即進(jìn)行 P/V 操作。
P 操作:申請資源,申清完后信號燈值-1;
V 操作:釋放資源,釋放資源后信號燈值+1
?Linux 提供了一組精心設(shè)計的信號量接口來對信號進(jìn)行操作,它們不只是針對二進(jìn)制信號量,下面將會 對這些函數(shù)進(jìn)行介紹,但請注意,這些函數(shù)都是用來對成組的信號量值進(jìn)行操作的。它們聲明在頭文件 sys/sem.h 中。
?
?
?
?實(shí)驗(yàn)代碼:
?指定哪個進(jìn)程運(yùn)行,可以使用進(jìn)程間通信的知識,或者使用信號量,這里以使用信號量為例:
?
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>
union semun
{
int val;
};
int main(void)
{
int semid;
int key;
pid_t pid;
struct sembuf sem;
union semun semun_union;
key = ftok("./a.c", 0666);
semid = semget(key, 1, 0666 | IPC_CREAT);
semun_union.val = 0;
semctl(semid, 0, SETVAL, semun_union);
pid = fork();
if (pid > 0)
{
sem.sem_num = 0;
sem.sem_op = -1;
sem.sem_flg = 0;
semop(semid, &sem, 1);
printf("This is parents\n");
sem.sem_num = 0;
sem.sem_op = 1;
sem.sem_flg = 0;
semop(semid, &sem, 1);
}
if (pid == 0)
{
sleep(2);
sem.sem_num = 0;
sem.sem_op = 1;
sem.sem_flg = 0;
semop(semid, &sem, 1);
printf("This is son\n");
}
return 0;
}
編譯運(yùn)行程序如下圖所示:
文章來源:http://www.zghlxwxcb.cn/news/detail-468030.html
?信號量是一個特殊的變量,程序?qū)ζ湓L問都是原子操作,且只允許對它進(jìn)行等待(即 P(信號變量))和發(fā) 送(即 V(信號變量))信息操作。我們通常通過信號來解決多個進(jìn)程對同一資源的訪問競爭的問題,使在任一 時刻只能有一個執(zhí)行線程訪問代碼的臨界區(qū)域,也可以說它是協(xié)調(diào)進(jìn)程間的對同一資源的訪問權(quán),也就是 用于同步進(jìn)程的。文章來源地址http://www.zghlxwxcb.cn/news/detail-468030.html
到了這里,關(guān)于linux進(jìn)程間通信(信號量)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!