linux訊號量函數詳解

來源:互聯網
上載者:User

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中的最後一個參數是一個等位型別的副本,而不是一個指向等位型別的指標。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.