国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C語言用信號量進(jìn)行pv操作

這篇具有很好參考價值的文章主要介紹了C語言用信號量進(jìn)行pv操作。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、獲取信號量

用semget()函數(shù)獲取信號量,其中semget()函數(shù)中所需傳的參數(shù)如下:

semget(key_t key , int nsems, semflg);

參數(shù)解釋:

1、其中key可以通過ftok()?函數(shù)進(jìn)行獲取,ftok函數(shù)所需傳入的參數(shù)為①文件路徑②一個八位的整數(shù)

2、nsems是所需創(chuàng)建的信號量的個數(shù),如果只是訪問已存在的信號量集合,可以將此參數(shù)設(shè)置為0。

3、semflg是一個標(biāo)志參數(shù),用于指定創(chuàng)建或訪問信號量集合的方式,常用的標(biāo)志有:

IPC_CREAT:如果指定的鍵值對應(yīng)的信號量集合不存在,則創(chuàng)建一個新的信號量集合。

IPC_EXCL:與IPC_CREAT同時使用,如果指定的鍵值對應(yīng)的信號量集合已經(jīng)存在,則返回錯誤。

0666:用于指定信號量集合的權(quán)限,表示允許所有用戶讀寫信號量集合,這里也可以是填其它權(quán)限,如0664等,不一定是0666

具體實現(xiàn):

int sem_creat(key_t key, int nsems)
{
    int semid = semget(key, nsems, 0664|IPC_CREAT);//創(chuàng)建信號量
    
    if(semid < 0){  //通過返回值判斷信號量是否創(chuàng)建成功,小于零則創(chuàng)建失敗,打印一下錯誤信息并退出
        perror("semget");
        exit(0);    
    }
    return semid;
}

二、初始化信號量

用semctl來初始化信號量,其中semctl函數(shù)所需傳入的參數(shù)如下:

int semctl(int semid, int semnum, int cmd, ...)

參數(shù)解釋:?

1、semid:信號量集合的標(biāo)識符,通過smget函數(shù)獲?。ㄒ簿褪巧弦徊将@取信號量的時候得到的)。

2、semnum:要操作的信號量在集合中的索引(也就是要初始化哪一個信號量),對于一個信號量集合可以有多個信號量,而semnum指定了要操作的具體信號量

3、cmd:指定要執(zhí)行的命令,可以是以下幾種之一:

①、GETVAL:獲取指定信號量的當(dāng)前值。

②、SETVAL:設(shè)置指定信號量的值。

③、IPC_RMID:刪除信號量集合。

④、IPC_STAT:獲取信號量集合的狀態(tài)信息。

⑤、IPC_SET:設(shè)置信號量集合的狀態(tài)信息。

⑥、GETALL:獲取所有信號量的當(dāng)前值。

⑦、SETALL:設(shè)置所有信號量的值。

4、....:表示可變參數(shù),根據(jù)不同的命令有不同的使用方式,需要注意的是。semctl函數(shù)的第四個參數(shù)arg的具體含義取決于使用命令和使用方式(也就是根據(jù)第三個參數(shù)來的),對于某些命令,arg是一個整數(shù)值,而對于其它命令,arg是一個指向union semun結(jié)構(gòu)體的指針。在使用semctl函數(shù)時,需要根據(jù)具體的需求和命令來確定如何使用這個參數(shù)。

具體實現(xiàn):

void init_sem(int semid,int semnum,int val)//初始化需要傳semid和初始化哪個信號量,還有初始化的值
{
    int ret;
    union semun sem;//這個是根據(jù)第三個參數(shù)來的,semun聯(lián)合體中有好多種數(shù)據(jù)類型
    sem.val = val;
    ret = semctl(semid,semnum,SETVAL,sem);//這里用的是SETVAL,所以要傳第四個參數(shù),也就是你要初始化的值
    if(ret < 0)//判斷是否初始化成功
    {
        perror("semctl");
        exit(0);
    }
}

注意:?union semun聯(lián)合體(也叫共用體)需要我們自己去實現(xiàn),大概的樣子長這樣:

union semun {
    int val;                  // 設(shè)置信號量的初始值或獲取當(dāng)前值
    struct semid_ds *buf;     // IPC_STAT 或 IPC_SET 時使用
    unsigned short *array;    // GETALL 或 SETALL 時使用
};

三、進(jìn)行p操作(加鎖操作)

用semop函數(shù)來進(jìn)行加鎖操作,semop函數(shù)傳入的參數(shù)如下:

?int semop(int semid, struct sembuf *sops, size_t nsops);

參數(shù)解釋:?

1、semid:是一個信號量集標(biāo)識符,用于指定要操作的信號量集。在使用semget函數(shù)創(chuàng)建信號量集后,會返回該標(biāo)識符。

2、sops:是一個指向sembuf結(jié)構(gòu)體數(shù)組的指針,每個sembuf結(jié)構(gòu)體表示對一個信號量的操作(也就是通過結(jié)構(gòu)體來設(shè)置信號量當(dāng)前的狀態(tài))。

sembuf結(jié)構(gòu)體的定義如下:

struct sembuf {
    unsigned short sem_num;  // 信號量在信號量集中的索引
    short sem_op;            // 信號量的操作
    short sem_flg;           // 操作標(biāo)志
};

其中

sem_num是要操作的信號量在信號量集中的索引,從0開始計數(shù)

sem_op:是對信號量的操作,可以是正整數(shù)、負(fù)整數(shù)或零。

·??正整數(shù)表示將信號量的值增加相應(yīng)的數(shù)量。

·??負(fù)整數(shù)表示將信號量的值減少相應(yīng)的數(shù)量。

·??零表示等待信號量變?yōu)榱恪?/p>

?sem_flg是操作標(biāo)志,用于指定操作的行為,常見的取值有:

  • SEM_UNDO:如果進(jìn)程退出時仍然持有該信號量,則會自動釋放。
  • IPC_NOWAIT:如果無法立即執(zhí)行操作,則函數(shù)會立即返回,并設(shè)置錯誤碼為EAGAIN。

3、nsops:表示sembuf結(jié)構(gòu)體數(shù)組中元素的數(shù)量,即要進(jìn)行操作的信號量的個數(shù)。

具體實現(xiàn):

void sem_p(int semid,int semnum,size_t nsops)
{
    struct sembuf sops;
    sops.sem_num = semnum;//設(shè)置要操作哪個信號量
    sops.sem_op = -1;//設(shè)置信號量要執(zhí)行的操作,-1是上鎖的操作,鎖-1
    sops.sem_flg = SEM_UNDO;//防止死鎖‘
    
    int ret = semop(semid,&sops,nsops);
    if(ret < 0)//判斷是否執(zhí)行成功
    {
        perror("semop-p");
        exit(0);
    }    
}

四、進(jìn)行v操作(解鎖操作)?

進(jìn)行v操作也是用的semop函數(shù),只是傳的參數(shù)不同,sops.sem_op = 1。

具體實現(xiàn):

void sem_v(int semnum,size_t nsops)
{
    struct sembuf sops;
    sops.sem_num = semnum;
    sops.sem_op = +1;//與p操作不同的地方
    sops.sem_flg = SEM_UNDO;
    
    int ret = semop(semid,&sops,nsops);
    if(ret < 0)
    {
        perror("semop-v");
        exit(0);
    }
}

五、釋放信號量

釋放信號量也可以用semctl()函數(shù),只是傳的參數(shù)有變化文章來源地址http://www.zghlxwxcb.cn/news/detail-635275.html

具體實現(xiàn):

void sem_destroy(int semid)
{
    int ret = semctl(semid,-1,IPC_RMID);
    if(ret < 0)
    {
        perror("semctl-rmid");
        exit(0);
    }
}

到了這里,關(guān)于C語言用信號量進(jìn)行pv操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 6.物聯(lián)網(wǎng)操作系統(tǒng)信號量

    6.物聯(lián)網(wǎng)操作系統(tǒng)信號量

    一。信號量的概念與應(yīng)用 信號量定義 FreeRTOS信號量介紹 FreeRTOS信號量工作原理 1.信號量的定義 ? ? ? ? 多任務(wù)環(huán)境下使用,用來協(xié)調(diào)多個任務(wù)正確合理使用臨界資源。 2.FreeRTOS信號量介紹 ????????Semaphore包括Binary,Count,Mutex; ? ? ? ? Mutex包括RecursiveMutex,Mutex。 3.Free

    2024年02月14日
    瀏覽(22)
  • 【Linux C | 多線程編程】線程同步 | 信號量(無名信號量) 及其使用例子

    【Linux C | 多線程編程】線程同步 | 信號量(無名信號量) 及其使用例子

    ??博客主頁??:??https://blog.csdn.net/wkd_007?? ??博客內(nèi)容??:??嵌入式開發(fā)、Linux、C語言、C++、數(shù)據(jù)結(jié)構(gòu)、音視頻?? ??本文內(nèi)容??:??介紹 ?? ??金句分享??:??你不能選擇最好的,但最好的會來選擇你——泰戈爾?? ?發(fā)布時間?: 本文未經(jīng)允許,不得轉(zhuǎn)發(fā)?。。?/p>

    2024年04月26日
    瀏覽(27)
  • linux(信號量)

    linux(信號量)

    1.回顧信號量的概念 2.認(rèn)識信號量對應(yīng)的操作函數(shù) 3.認(rèn)識一個環(huán)形隊列 4.結(jié)合sem+環(huán)形隊列寫生產(chǎn)者消費者模型 --------------------------------------------------------------------------------------------------------------------------------- 1.回顧信號量的概念 ?每個人想進(jìn)放映廳看電影,第一件事就是買票

    2024年02月11日
    瀏覽(42)
  • linux信號量

    linux信號量

    通過學(xué)習(xí)linux的信號量,對linux的信號量進(jìn)行了編程。

    2024年02月10日
    瀏覽(20)
  • 【Linux】淺談信號量

    【Linux】淺談信號量

    tips:system V 是一套標(biāo)準(zhǔn),共享內(nèi)存,信號量,消息隊列屬于system V。 進(jìn)程A和進(jìn)程B進(jìn)行通信時,假如進(jìn)程A向物理內(nèi)存的共享區(qū)寫入\\\"Hello World\\\",但是當(dāng)進(jìn)程A寫入了\\\"Hello\\\"時,進(jìn)程B就向內(nèi)存讀取了,所以只讀取到了\\\"Hello\\\",這就導(dǎo)致進(jìn)程A想向進(jìn)程B發(fā)送的信息,進(jìn)程B讀取不完整,

    2024年02月05日
    瀏覽(19)
  • linux進(jìn)程間通信(信號量)

    linux進(jìn)程間通信(信號量)

    信號量是一個特殊的變量,程序?qū)ζ湓L問都是原子操作,且只允許對它進(jìn)行等待(即 P(信號變量))和發(fā) 送(即 V(信號變量))信息操作。最簡單的信號量是只能取 0 和 1 的變量,這也是信號量最常見的一種形式, 叫做二進(jìn)制信號量。而可以取多個正整數(shù)的信號量被稱為通用信號

    2024年02月07日
    瀏覽(33)
  • 【Linux】進(jìn)程間通信 -- 信號量

    【Linux】進(jìn)程間通信 -- 信號量

    信號量是什么? 本質(zhì)是一個計數(shù)器,通常用來表示公共資源中,資源數(shù)量多少的問題 公共資源:能被多個進(jìn)程同時可以訪問的資源 訪問沒有保護(hù)的公共資源:數(shù)據(jù)不一致問題(比如我想寫abc123,但是我123還沒有寫入,就讀取了abc,可能數(shù)據(jù)分開會導(dǎo)致數(shù)據(jù)無意義) 為什么要

    2024年02月16日
    瀏覽(25)
  • 【Linux篇】第十七篇——信號量

    【Linux篇】第十七篇——信號量

    前言 POSIX信號量 信號量的概念 信號量的工作原理 信號量函數(shù) 二元信號量模擬實現(xiàn)互斥功能 基于環(huán)形隊列的生產(chǎn)消費模型 空間資源和數(shù)據(jù)資源 生產(chǎn)者和消費者申請和釋放資源 必須遵守的兩個規(guī)則 代碼實現(xiàn) 信號量保護(hù)環(huán)形隊列的原理 將可能被多個執(zhí)行流同時訪問的資源叫

    2024年02月06日
    瀏覽(20)
  • 12.3用信號量進(jìn)行線程同步——生產(chǎn)者與消費者問題

    1.shell程序設(shè)計 2.內(nèi)存管理 3.鏈接庫 4.文件操作

    2024年02月04日
    瀏覽(26)
  • linux中互斥鎖,自旋鎖,條件變量,信號量,與freeRTOS中的消息隊列,信號量,互斥量,事件的區(qū)別

    linux中互斥鎖,自旋鎖,條件變量,信號量,與freeRTOS中的消息隊列,信號量,互斥量,事件的區(qū)別

    對于目前主流的RTOS的任務(wù),大部分都屬于并發(fā)的線程。 因為MCU上的資源每個任務(wù)都是共享的,可以認(rèn)為是單進(jìn)程多線程模型。 【freertos】003-任務(wù)基礎(chǔ)知識 在沒有操作系統(tǒng)的時候兩個應(yīng)用程序進(jìn)行消息傳遞一般使用全局變量的方式,但是如果在使用操作系統(tǒng)的應(yīng)用中用全局變

    2024年02月11日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包