青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Prayer

在一般中尋求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

信號量函數 semget() semop() semctl()

Posted on 2009-03-05 15:30 Prayer 閱讀(2833) 評論(0)  編輯 收藏 引用 所屬分類: LINUX/UNIX/AIX

問共享資源進行控制的機制,其實為了解決互斥共享資源的同步問題而引入的機制。
不能單獨定義一個信號量,而只能定義一個信號量集,其中包括一組信號量,同意信號量集中的信號量使用同
一引用ID,這樣設置是為了多個資源或同步操作的需要。
與信號量有關的幾個系統調用函數:
1、信號量集得創建與打開 semget()
原型:int semget(key_t key,int nsems,int semflg);
其中 參數key表示所創建或打開信號量集的鍵。
參數nsems表示創建的信號量集中的信號量的個數,該參數只在創建信號量集時有效。
參數flag表示調用函數的操作類型,也可用于設置信號量集的訪問權限,兩者通過or表示。
當調用semget創建一個信號量時,他的相應的semid_ds結構被初始化。ipc_perm中各個量被設置為相應
值,sem_nsems被設置為nsems所示的值,sem_otime被設置為0,sem_ctime被設置為當前時間
返回值:如果成功,則返回信號量集的IPC標識符。如果失敗,則返回-1:errno=EACCESS(沒有權限)
EEXIST(信號量集已經存在,無法創建)
EIDRM(信號量集已經刪除)
ENOENT(信號量集不存在,同時沒有使用IPC_CREAT)
ENOMEM(沒有足夠的內存創建新的信號量集)
ENOSPC(超出限制)
系統調用semget()的第一個參數是關鍵字值(一般是由系統調用ftok()返回的)。系統內核將此值和系統中
存在的其他的信號量集的關鍵字值進行比
較。打開和存取操作與參數semflg中的內容相關。IPC_CREAT如果
信號量集在系統內核中不存在,則創建信號量集。IPC_EXCL當和
IPC_CREAT一同使用時,如果信號量集已經
存在,則調用失敗。如果單獨使用IPC_CREAT,則semget()要么返回新創建的信號量集的標識
符,要么返回
系統中已經存在的同樣的關鍵字值的信號量的標識符。如果IPC_EXCL和IPC_CREAT一同使用,則要么返回新
創建的信號量集的標識
符,要么返回-1。IPC_EXCL單獨使用沒有意義。參數nsems指出了一個新的信號量集
中應該創建的信號量的個數。
2、信號量的操作 semop()
調用原型:int semop(int semid,struct sembuf*sops,unsign ednsops);
其中   semid為信號量集引用ID。
    semoparray是一個sembuff結構數組,sembuff結構用于指定調用semop函數所作的操作,數組
    semoparray元素的個數有參數nops指出。
    semoparray是一個數組,其中每個元素表是一個操作,由于此函數是一個原子操作,一旦執行就
將執行數組中的所有操作。
返回值:0,如果成功。-1,如果失敗:errno=E2BIG(nsops大于最大的ops數目)
EACCESS(權限不夠)
EAGAIN(使用了IPC_NOWAIT,但操作不能繼續進行)
EFAULT(sops指向的地址無效)
EIDRM(信號量集已經刪除)
EINTR(當睡眠時接收到其他信號)
EINVAL(信號量集不存在,或者semid無效)
ENOMEM(使用了SEM_UNDO,但無足夠的內存創建所需的數據結構)
ERANGE(信號量值超出范圍)
如果sem_op是負數,那么信號量將減去它的值。這和信號量控制的資源有關。如果沒有使用IPC_NOWAIT,
那么調用進程將進入睡眠狀態,直到信號
量控制的資源可以使用為止。如果sem_op是正數,則信號量加上
它的值。這也就是進程釋放信號量控制的資源。最后,如果sem_op是0,那么調用進程
將調用sleep(),
直到信號量的值為0。這在一個進程等待完全空閑的資源時使用。
3、信號量的控制 semctl()
原型:int semctl(int semid,int semnum,int cmd,union semun arg);
其中   semid為信號量集引用標志符。
    semnum用于指定某個特定信號量。
    cmd表示調用該函數執行的操作,其取值和對應操作如下:
      .IPC_STAT讀取一個信號量集的數據結構semid_ds,并將其存儲在semun中的buf參數中。
      ·IPC_SET設置信號量集的數據結構semid_ds中的元素ipc_perm,其值取自semun中的buf參數。
      ·IPC_RMID將信號量集從內存中刪除。
      ·GETALL用于讀取信號量集中的所有信號量的值。
      ·GETNCNT返回正在等待資源的進程數目。
      ·GETPID返回最后一個執行semop操作的進程的PID。
      ·GETVAL返回信號量集中的一個單個的信號量的值。
      ·GETZCNT返回這在等待完全空閑的資源的進程數目。
      ·SETALL設置信號量集中的所有的信號量的值。
      ·SETVAL設置信號量集中的一個單獨的信號量的值。
arg是semnu的是一個聯合類型的副本,而不是一個指向聯合類型的指針。聯合中各個量的使用情況
和參數cmd的設置有關。

參考文獻:linux環境下C編程指南
      http://qq164587043.blog.51cto.com/261469/51549

semget()

     可以使用系統調用semget()創建一個新的信號量集,或者存取一個已經存在的信號量集:
系統調用:semget();
原型:intsemget(key_t key,int nsems,int semflg);
返回值:如果成功,則返回信號量集的IPC標識符。如果失敗,則返回-1:errno=EACCESS(沒有權限)
EEXIST(信號量集已經存在,無法創建)
EIDRM(信號量集已經刪除)
ENOENT(信號量集不存在,同時沒有使用IPC_CREAT)
ENOMEM(沒有足夠的內存創建新的信號量集)
ENOSPC(超出限制)
    系統調用semget()的第一個參數是關鍵字值(一般是由系統調用ftok()返回的)。系統內核將此值和系統中存在的其他的信號量集的關鍵字值進行比 較。打開和存取操作與參數semflg中的內容相關。IPC_CREAT如果信號量集在系統內核中不存在,則創建信號量集。IPC_EXCL當和 IPC_CREAT一同使用時,如果信號量集已經存在,則調用失敗。如果單獨使用IPC_CREAT,則semget()要么返回新創建的信號量集的標識 符,要么返回系統中已經存在的同樣的關鍵字值的信號量的標識符。如果IPC_EXCL和IPC_CREAT一同使用,則要么返回新創建的信號量集的標識 符,要么返回-1。IPC_EXCL單獨使用沒有意義。參數nsems指出了一個新的信號量集中應該創建的信號量的個數。信號量集中最多的信號量的個數是 在linux/sem.h中定義的:
#defineSEMMSL32/*<=512maxnumofsemaphoresperid*/
下面是一個打開和創建信號量集的程序:
intopen_semaphore_set(key_t keyval,int numsems)
{
intsid;
if(!numsems)
return(-1);
if((sid=semget(mykey,numsems,IPC_CREAT|0660))==-1)
{
return(-1);
}
return(sid);
}
};
==============================================================
semop()

系統調用:semop();
調用原型:int semop(int semid,struct sembuf*sops,unsign ednsops);
返回值:0,如果成功。-1,如果失敗:errno=E2BIG(nsops大于最大的ops數目)
EACCESS(權限不夠)
EAGAIN(使用了IPC_NOWAIT,但操作不能繼續進行)
EFAULT(sops指向的地址無效)
EIDRM(信號量集已經刪除)
EINTR(當睡眠時接收到其他信號)
EINVAL(信號量集不存在,或者semid無效)
ENOMEM(使用了SEM_UNDO,但無足夠的內存創建所需的數據結構)
ERANGE(信號量值超出范圍)
    第一個參數是關鍵字值。第二個參數是指向將要操作的數組的指針。第三個參數是數組中的操作的個數。參數sops指向由sembuf組成的數組。此數組是在linux/sem.h中定義的:
/*semop systemcall takes an array of these*/
structsembuf{
ushortsem_num;/*semaphore index in array*/
shortsem_op;/*semaphore operation*/
shortsem_flg;/*operation flags*/
sem_num將要處理的信號量的個數。
sem_op要執行的操作。
sem_flg操作標志。
    如果sem_op是負數,那么信號量將減去它的值。這和信號量控制的資源有關。如果沒有使用IPC_NOWAIT,那么調用進程將進入睡眠狀態,直到信號 量控制的資源可以使用為止。如果sem_op是正數,則信號量加上它的值。這也就是進程釋放信號量控制的資源。最后,如果sem_op是0,那么調用進程 將調用sleep(),直到信號量的值為0。這在一個進程等待完全空閑的資源時使用。
===============================================================
semctl()

系統調用:semctl();
原型:int semctl(int semid,int semnum,int cmd,union semunarg);
返回值:如果成功,則為一個正數。
如果失敗,則為-1:errno=EACCESS(權限不夠)
EFAULT(arg指向的地址無效)
EIDRM(信號量集已經刪除)
EINVAL(信號量集不存在,或者semid無效)
EPERM(EUID沒有cmd的權利)
ERANGE(信號量值超出范圍)
    系統調用semctl用來執行在信號量集上的控制操作。這和在消息隊列中的系統調用msgctl是十分相似的。但這兩個系統調用的參數略有不同。因為信號 量一般是作為一個信號量集使用的,而不是一個單獨的信號量。所以在信號量集的操作中,不但要知道IPC關鍵字值,也要知道信號量集中的具體的信號量。這兩 個系統調用都使用了參數cmd,它用來指出要操作的具體命令。兩個系統調用中的最后一個參數也不一樣。在系統調用msgctl中,最后一個參數是指向內核 中使用的數據結構的指針。我們使用此數據結構來取得有關消息隊列的一些信息,以及設置或者改變隊列的存取權限和使用者。但在信號量中支持額外的可選的命 令,這樣就要求有一個更為復雜的數據結構。
系統調用semctl()的第一個參數是關鍵字值。第二個參數是信號量數目。
    參數cmd中可以使用的命令如下:
    ·IPC_STAT讀取一個信號量集的數據結構semid_ds,并將其存儲在semun中的buf參數中。
    ·IPC_SET設置信號量集的數據結構semid_ds中的元素ipc_perm,其值取自semun中的buf參數。
    ·IPC_RMID將信號量集從內存中刪除。
    ·GETALL用于讀取信號量集中的所有信號量的值。
    ·GETNCNT返回正在等待資源的進程數目。
    ·GETPID返回最后一個執行semop操作的進程的PID。
    ·GETVAL返回信號量集中的一個單個的信號量的值。
    ·GETZCNT返回這在等待完全空閑的資源的進程數目。
    ·SETALL設置信號量集中的所有的信號量的值。
    ·SETVAL設置信號量集中的一個單獨的信號量的值。
    參數arg代表一個semun的實例。semun是在linux/sem.h中定義的:
/*arg for semctl systemcalls.*/
unionsemun{
intval;/*value for SETVAL*/
structsemid_ds*buf;/*buffer for IPC_STAT&IPC_SET*/
ushort*array;/*array for GETALL&SETALL*/
structseminfo*__buf;/*buffer for IPC_INFO*/
void*__pad;
    val當執行SETVAL命令時使用。buf在IPC_STAT/IPC_SET命令中使用。代表了內核中使用的信號量的數據結構。array在使用GETALL/SETALL命令時使用的指針。
    下面的程序返回信號量的值。當使用GETVAL命令時,調用中的最后一個參數被忽略:
intget_sem_val(intsid,intsemnum)
{
return(semctl(sid,semnum,GETVAL,0));
}
    下面是一個實際應用的例子:
#defineMAX_PRINTERS5
printer_usage()
{
int x;
for(x=0;x<MAX_PRINTERS;x++)
printf("Printer%d:%d\n\r",x,get_sem_val(sid,x));
}
    下面的程序可以用來初始化一個新的信號量值:
void init_semaphore(int sid,int semnum,int initval)
{
union semunsemopts;
semopts.val=initval;
semctl(sid,semnum,SETVAL,semopts);
}
    注意系統調用semctl中的最后一個參數是一個聯合類型的副本,而不是一個指向聯合類型的指針。
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美理论在线播放| 在线一区亚洲| 另类av一区二区| 亚洲一区二区网站| 在线综合亚洲| 亚洲精品你懂的| 亚洲国产精品一区二区久| 久久精品国产第一区二区三区最新章节 | 欧美粗暴jizz性欧美20| 亚洲图中文字幕| 亚洲美女在线一区| 日韩一区二区免费高清| 99精品国产在热久久下载| av成人免费在线观看| 亚洲一区免费视频| 欧美一区国产在线| 牛人盗摄一区二区三区视频| 欧美高清视频在线| 国产女主播一区二区三区| 国内不卡一区二区三区| 国产日韩一区二区三区在线播放| 99在线精品视频| 欧美日韩一区自拍| 久久一区视频| 欧美手机在线| 亚洲国产乱码最新视频| 欧美制服丝袜第一页| 亚洲第一区在线观看| av成人免费| 欧美日韩一区三区| 亚洲欧洲日本一区二区三区| 亚洲欧美在线一区| 亚洲人成免费| 欧美成人午夜激情视频| 国产欧美一区二区视频| 欧美国产日产韩国视频| 国产亚洲精品久久久久婷婷瑜伽| 一本色道久久99精品综合 | 欧美风情在线| 国产欧美丝祙| 久久精品国产96久久久香蕉| 91久久久久久国产精品| 欧美成人高清| 99国产精品久久久久久久成人热| 美女网站在线免费欧美精品| 久久精品国产999大香线蕉| 狠狠色狠狠色综合人人| 午夜精品久久久久久久99黑人| 亚洲国产一区在线观看| 欧美日韩你懂的| 一本色道久久综合亚洲精品按摩| 亚洲精品孕妇| 国产在线精品自拍| 毛片基地黄久久久久久天堂| 久久久噜噜噜久久| 亚洲精品永久免费精品| 国产亚洲激情视频在线| 久久精品理论片| 免费不卡在线观看| 亚洲一区二区三区在线观看视频 | 亚洲国产精品久久| 亚洲国产天堂久久综合网| 欧美日韩成人网| 香蕉久久一区二区不卡无毒影院| 欧美在线一二三区| 一区二区高清视频在线观看| 亚洲欧美日韩成人高清在线一区| 亚洲福利视频在线| 亚洲国产成人91精品 | 老司机精品视频一区二区三区| 蜜臀av在线播放一区二区三区| 亚洲午夜激情免费视频| 欧美福利电影网| 欧美sm视频| 在线欧美视频| 另类图片国产| 欧美激情亚洲一区| 狠狠色综合日日| 久久精品综合一区| 久久精品国产69国产精品亚洲| 国产精品人人做人人爽| 在线视频你懂得一区| 午夜伦欧美伦电影理论片| 欧美三级视频| 久久www成人_看片免费不卡| 久久久亚洲欧洲日产国码αv| 狠狠v欧美v日韩v亚洲ⅴ| 91久久精品国产91久久| 女人色偷偷aa久久天堂| 亚洲激情视频| 午夜在线精品偷拍| 伊人久久亚洲美女图片| 欧美成年网站| 亚洲一区二区三区四区五区黄 | 日韩视频免费在线| 欧美日韩另类综合| 欧美一区二区在线| 亚洲精品美女| 久久只精品国产| 一区二区国产在线观看| 国产欧美va欧美不卡在线| 免费视频久久| 另类欧美日韩国产在线| 国产一区日韩二区欧美三区| 欧美成年人视频网站| 亚洲午夜精品17c| 亚洲三级视频| 久久久久久夜| 欧美一区二区成人| 一区二区欧美精品| 亚洲黄色天堂| 狠狠色丁香婷婷综合影院| 欧美视频精品在线观看| 欧美—级a级欧美特级ar全黄| 久久国产精品黑丝| 亚洲高清激情| 韩国成人精品a∨在线观看| 国产免费成人| 欧美午夜精品一区二区三区| 美女精品一区| 久久亚洲私人国产精品va| 亚洲在线播放电影| 亚洲欧美国产高清| 午夜免费在线观看精品视频| 亚洲视频精品| 欧美一区二区三区免费视频| 亚洲欧美日韩天堂| 亚洲欧美视频在线观看| 性色av香蕉一区二区| 久久久久久网址| 欧美成人dvd在线视频| 亚洲国产色一区| 亚洲一区二区动漫| 久久大逼视频| 欧美精品导航| 国产亚洲观看| 日韩一级大片| 老司机一区二区三区| 99在线|亚洲一区二区| 欧美在线观看你懂的| 欧美肥婆在线| 狠狠色丁香婷婷综合影院| 99精品久久久| 欧美午夜在线视频| 国产女人aaa级久久久级| 一本色道**综合亚洲精品蜜桃冫| 性欧美在线看片a免费观看| 亚洲第一偷拍| 久久婷婷麻豆| 国产一区二区精品久久| 中文在线不卡视频| 欧美国产免费| 男女av一区三区二区色多| 国产日韩1区| 欧美一区二区三区视频在线| 日韩午夜剧场| 亚洲图片自拍偷拍| 亚洲人成啪啪网站| 欧美福利视频在线| 99精品福利视频| 99精品视频免费观看视频| 欧美女同视频| 在线中文字幕一区| 亚洲女爱视频在线| 国产乱码精品一区二区三区不卡| 亚洲视频一二区| 亚洲视频综合在线| 国产麻豆综合| 麻豆久久久9性大片| 欧美黄污视频| 久久se精品一区精品二区| 午夜精品在线| 亚洲乱码视频| 欧美在线视频一区| 99这里只有精品| 欧美中文在线免费| 一区二区三区欧美日韩| 欧美一级视频精品观看| 亚洲午夜视频在线| 亚洲天堂久久| 免费欧美日韩| 欧美精品情趣视频| 久久久国产视频91| 欧美日韩hd| 亚洲第一中文字幕| 国产亚洲欧美一区在线观看| 91久久精品日日躁夜夜躁欧美 | 久久精品国产第一区二区三区最新章节 | 99视频超级精品| 国产精品一区二区男女羞羞无遮挡| 午夜免费久久久久| 亚洲国产影院| 久久亚洲一区二区三区四区| 亚洲午夜在线观看| 亚洲精品视频在线观看免费| 国产视频一区免费看| 国产精品v欧美精品v日韩精品 | 久久国产日韩欧美| 午夜影视日本亚洲欧洲精品| 亚洲专区在线|