999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

linux下多值信號量的操作探討

2017-04-01 17:32:27許豪單平平
數字技術與應用 2016年10期

許豪++單平平

摘要:本文簡單介紹了Linux下信號量通信機制的發展歷史,信號量通信的特點,主要針對信號量的操作進行分析,其中包括創建信號量集合,修改信號量集合中某個信號量的值,如何獲得信號量集合中某個信號量的值。文章最后給出多值信號量操作的實例,并且指出多值信號量操作時應該關注的重點問題。

關鍵詞:信號量 進程間通信 操作

中圖分類號:TP368.1 文獻標識碼:A 文章編號:1007-9416(2016)10-0240-01

1 Linux信號量通信機制發展史

Linux操作系統中有多種進程間通信方式。本文主要圍繞信號量這種進程間通信方式進行闡述。信號量的概念最早由荷蘭學者Edsger Dijkstra于1965年提出,目前已經發展成一種卓有成效的進程間通信機制。通過該機制可以有效的控制兩個進程對共享資源的同步訪問操作。

2 Linux單值信號量的操作

當信號量集合中只有一個信號量的時候,可以直接調用函數semop(int semid, struct sembuf *opsptr, size_t nops)來完成操作。其中第一個參數semid是信號量集合的標識符,即semget函數執行成功后的返回值;第二個參數opsptr比較復雜,是struct sembuf類型的結構體,該結構體與我們對信號量的操作緊密相關。結構體原型為struct sembuf {short sem_num; short sem_op; short sem_flg; };有三個屬性,第一個屬性sem_num為信號量在信號量集合中的編號;第二個屬性sem_op為當前信號量需要改變的值,如果該屬性為正值,則在當前信號量基礎之上增加sem_op,如果該屬性為負值,則在當前信號量值的基礎上減去sem_op,第三個屬性為標志位,當取值為SEM_UNDO時,表示進程結束后由內核釋放信號量發生改變的值。semop函數中的第三個參數表示對該信號量操作的次數。如果對該信號量操作一次,則參數nops取值為”1”,如果要操作兩次,則該參數取值為”2”。如果要對某個信號量做多次操作的時候,需要把相關的操作封裝到struct sembuf類型的數組中,即定義一個數組struct sembuf opbuf[2],然后對數組進行賦值opbuf[0].sem_num=0;opbuf[0].sem_op=1;opbuf[0].sem_flg=IPC_NOWAIT,這些數值表示對信號量集合中的第一個信號量進行加”1”操作,因為需要對該信號量進行兩次操作,所以還需要對數組opbuf中的第二個元素進行賦值操作,即opbuf[1].sem_num=0;opbuf[1].sem_op=1;opbuf[1].sem_flg=IPC_NOWAIT。表示對信號量集合中的第一個信號量再次做加”1”操作。此時參數opstr取值為opbuf。

Semctl函數用來對信號量集合的屬性進行操作。原型為semctl(int semid,int semnum,int cmd,../* union semun arg */);第一個參數semid為信號量集標識符,即semget的返回值,第二個參數semnum對應信號量在信號集合中的編號,第三個參數cmd是需要我們關注的參數,該參數與semctl函數完成的功能緊密相關,第四個參數是一個聯合類型的變量,該變量中的值主要根據參數cmd的變化而發生改變。如果要得到單個信號量集合中的信號量的值,只需要給參數cmd賦值為GETVAL即可,此時,完全可以把第四個參數忽略掉。int semValue1=semctl(sem_id, 0, GETVAL);這行代碼就表示得到標識符為sem_id的信號量集合中的編號為0的信號量的值,并且把該值保存在int類型的變量semValue1中。

3 Linux多值信號量的操作

如果信號量集合中有多個信號量,則需要分別調用代碼int semValue1=semctl(sem_id, 0,GETVAL)多次。由此可見這種方式代碼重復性較高,也比較麻煩。能否找到一種簡單的方法直接得到該信號量集合中的所有信號量的值?答案是肯定的。這個時候需要用到semctl函數中的第四個參數,即union semun{int val;struct semid_ds *buf;ushort *array;struct seminfo *__buf; };需要先在代碼中聲明一下這個類型,然后定義此類型的變量,例如union semun semarg;再定義一個unsigned short 類型的數組,代碼為unsigned shortreturnvalue[2]={0,0};該數組用來存放取出的信號量的值;第三步必須要給聯合類型的變量semarg中的array屬性賦值為第二步中定義的數組變量returnvalue,對應代碼semarg.array=returnvalue;如果沒有該步操作,相當于沒有給semarg.array指針賦值,則程序運行結束后會收到SIGSEGV信號,從而出現段錯誤。之后可以調用semctl函數完成取值操作,此時,semctl函數中的第三個參數需要設置為GETALL,代碼為semctl(sem_id,0,GETALL,semarg);便可以把標識符為sem_id的信號量集合中的所有信號量的值取出來,放入semarg變量中。

參考文獻

[1]W.Richard Stevens,Stephen A. Rago 著 尤晉元等譯.UNIX環境高級編程[M].北京:人民郵電出版社,2006,422-426.

[2]楊宗德.Linux高級程序設計[M].北京:人民郵電出版社,2012,273-285.

[3]楊水清.精通ARM嵌入式Linux系統開發[M].北京:電子工業出版社,2012,417-420.

收稿日期:2016-08-18

作者簡介:許豪(1982—),男,河南南陽人,碩士,講師,主要研究方向:嵌入式Linux開發,云計算相關。

主站蜘蛛池模板: 国产精品成人AⅤ在线一二三四| 精品国产女同疯狂摩擦2| 亚洲国产在一区二区三区| 亚洲91精品视频| 国产成人精品亚洲77美色| 97色婷婷成人综合在线观看| 日韩激情成人| 国产精品成人一区二区不卡 | 亚洲欧美另类中文字幕| 国产网站一区二区三区| 国产精女同一区二区三区久| 四虎永久在线| 日本一区二区三区精品AⅤ| 国产丝袜无码精品| 国产激情无码一区二区三区免费| 国产精品一区二区在线播放| 少妇露出福利视频| a级毛片在线免费| 欧美国产在线看| www.日韩三级| 久久国产精品波多野结衣| 亚洲毛片网站| 无码一区二区波多野结衣播放搜索| 欧美亚洲国产精品久久蜜芽| 有专无码视频| 午夜日本永久乱码免费播放片| 亚洲永久视频| 国产精品一区在线观看你懂的| 婷五月综合| 国产日韩丝袜一二三区| 亚洲无码在线午夜电影| 国产一区在线观看无码| 亚洲精品国产乱码不卡| 天天躁日日躁狠狠躁中文字幕| 国产成人夜色91| 欧美日韩专区| 亚洲人精品亚洲人成在线| 中国精品自拍| 欧美成人区| 一区二区三区四区精品视频| 国产成人三级| 又黄又爽视频好爽视频| 伊人久久大香线蕉成人综合网| 婷婷综合色| 永久免费AⅤ无码网站在线观看| 91 九色视频丝袜| 九九热精品视频在线| 四虎成人在线视频| 在线观看热码亚洲av每日更新| 国产农村精品一级毛片视频| 免费无遮挡AV| 欧美日韩在线观看一区二区三区| 国产一区二区三区在线观看免费| 亚洲欧美日韩中文字幕在线一区| 动漫精品中文字幕无码| 亚洲成人动漫在线| 亚洲AV人人澡人人双人| 熟女成人国产精品视频| 高清国产在线| 亚洲国产精品日韩专区AV| 国产成人精品午夜视频'| 69综合网| 无码中文字幕精品推荐| 国产国模一区二区三区四区| 在线观看无码a∨| 中文字幕精品一区二区三区视频| 114级毛片免费观看| 成人国产精品网站在线看| 一区二区欧美日韩高清免费| 国产午夜人做人免费视频| 中文字幕不卡免费高清视频| 午夜激情福利视频| 中文无码影院| 国产第一页免费浮力影院| 国产精品护士| 国内嫩模私拍精品视频| 一本一本大道香蕉久在线播放| 亚洲香蕉伊综合在人在线| 精品视频免费在线| 国产精品亚洲va在线观看 | 亚洲天堂久久| 国产一二三区在线|