国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
linux信號量_閑の洎茬

1.1 創(chuàng)建信號量
int semget(
   key_t key,   //標(biāo)識信號量的關(guān)鍵字,有三種方法:1、使用IPC——PRIVATE讓系統(tǒng)產(chǎn)生,
      // 2、挑選一個隨機(jī)數(shù),3、使用ftok從文件路徑名中產(chǎn)生
   int nSemes,   //信號量集中元素個數(shù)
   int flag   //IPC_CREAT;IPC_EXCL 只有在信號量集不存在時創(chuàng)建
)
成功:返回信號量句柄
失?。悍祷?1

1.2 使用ftok函數(shù)根據(jù)文件路徑名產(chǎn)生一個關(guān)鍵字
key_t ftok(const char *pathname,int proj_id);
路徑名稱必須有相應(yīng)權(quán)限

1.3 控制信號量
int semctl(
   int semid,   //信號量集的句柄
   int semnum,   //信號量集的元素數(shù)
   int cmd,   //命令
   /*union senum arg */... //  
)
成功:返回相應(yīng)的值
失?。悍祷?1

命令詳細(xì)說明:
cmd: IPC_RMID 刪除一個信號量
   IPC_EXCL 只有在信號量集不存在時創(chuàng)建
   IPC_SET 設(shè)置信號量的許可權(quán)
   SETVAL 設(shè)置指定信號量的元素的值為 agc.val
   GETVAL 獲得一個指定信號量的值
   GETPID 獲得最后操縱此元素的最后進(jìn)程ID
   GETNCNT 獲得等待元素變?yōu)?的進(jìn)程數(shù)
   GETZCNT 獲得等待元素變?yōu)?的進(jìn)程數(shù)
  
union senum 定義如下:
union senum{
   int val;
   struct semid_ds *buf;
   unsigned short * array;
}agc;
其中 semid_ds 定義如下:
struct semid_ds{
   struct ipc_pem sem_pem;   //operation pemission struct
   time_t sem_otime;   //last semop()time
   time_t sem_ctime;   //last time changed by semctl()
   struct sem *sembase;   //ptr to first semaphore in array
   struct sem_queue *sem_pending; //pending operations
   struct sem_queue *sem_pending_last; //last pending operations
   struct sem_undo *undo;   //undo requests on this arrary
   unsigned short int sem_nsems; //number of semaphores in set
};
  
1.4 對信號量 +1 或 -1 或測試是否為0
int semop(
   int semid,
   struct sembuf *sops, //指向元素操作數(shù)組
   unsigned short nsops //數(shù)組中元素操作的個數(shù)
)

結(jié)構(gòu) sembuf 定義
sembuf{
   short int sem_num; //semaphore number
   short int sem_op; //semaphore operaion
   short int sem_flg //operation flag
};

*********************程序相關(guān)信息*********************
程序編號:014
程序編寫起始日期:2008.11.2
程序編寫完成日期:2008.11.2
程序修改日期:                                   修改備注:
程序目的:學(xué)習(xí)linux信號量
所用主要函數(shù):ftok(),semget(),semop(),semctl()
程序說明:在本機(jī)上運行時,可以把程序中的“./test.c”修改成自己機(jī)器上的某個文件(要帶路徑)
程序完成地點: 宿舍內(nèi)
*********************程序相關(guān)信息*********************/
#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<stdlib.h>
#include<math.h>
#include<errno.h>
int main()
{
    int pid,val,semid;//中者為可用資源數(shù)量,后者為信號燈(即信號量)集的識別代號
    key_t semkey;
    if((semkey=ftok("./test.c",1))<0)//將文件路徑和項目ID(后面那個“1“)轉(zhuǎn)換為System V IPC Key
    {
        printf("ftok函數(shù)轉(zhuǎn)換出現(xiàn)錯誤。\n");
        exit(1);
    }
    else
        printf("ftok函數(shù)轉(zhuǎn)換成功,key值為%d\n",semkey);
    if((semid=semget(semkey,1,IPC_CREAT|IPC_EXCL|0700))<0)//創(chuàng)建信號燈集,其中包含1個信號燈
    {
        printf("semget函數(shù)創(chuàng)建信號燈集出現(xiàn)錯誤。\n");
        exit(2);
    }
    else
        printf("semget函數(shù)創(chuàng)建信號燈集成功,信號燈集識別代號semid為:%d\n",semid);
    val=1;
    if((semctl(semid,0,SETVAL,val))<0)//此句與上句合起來的功能是將semid對應(yīng)的信號集中的第一個信號(0表示第一個信號)的可用資源數(shù)量設(shè)置為1
    {
        printf("semctl函數(shù)設(shè)置可用資源數(shù)量時出現(xiàn)錯誤。\n");
        exit(9);
    }
    else
        printf("semctl函數(shù)設(shè)置可用資源數(shù)量成功。\n");
    if((pid=fork())<0)
    {
        printf("fork函數(shù)創(chuàng)建子進(jìn)程出現(xiàn)錯誤。\n");
        exit(3);
    }
    else if(pid>0)//父進(jìn)程,先索取共享資源,而后釋放
    {
        struct sembuf p_op_buf,v_op_buf;
        printf("父進(jìn)程ID為:%d,該進(jìn)程將要索取共享資源\n",getpid());
        p_op_buf.sem_num=0;
        p_op_buf.sem_op=-1;
        if(semop(semid,&p_op_buf,1)<0)//以上三行向semid代表的信號燈集的第一個信號燈申請一個資源
        {
            printf("父進(jìn)程中,semop函數(shù)索取共享資源出現(xiàn)錯誤。\n");
            exit(4);
        }
        else
        {
            int i;
            printf("父進(jìn)程中,semop函數(shù)索取共享資源成功,索取個數(shù)為:%d\n",abs(p_op_buf.sem_op));
            printf("ID為%d的父進(jìn)程現(xiàn)在要睡上6秒鐘。\n",getpid());
            for(i=6;i>0;i--)
            {
                printf("%d號進(jìn)程(父進(jìn)程)還要睡%d秒鐘……\n",getpid(),i);
                sleep(1);
            }
            printf("%d號進(jìn)程(父進(jìn)程)已經(jīng)醒來,并將釋放資源。\n",getpid());
            v_op_buf.sem_num=0;
            v_op_buf.sem_op=1;
            p_op_buf.sem_flg=0;//該標(biāo)志位此處不清零不會出現(xiàn)錯誤,但下面子進(jìn)程中的該標(biāo)志位應(yīng)清零,因為那時父進(jìn)程已經(jīng)占據(jù)了資源,子進(jìn)程申請不到資源的情況下,該標(biāo)志位如果不清零(比如采用不賦值的默認(rèn)處理),可能會出現(xiàn)錯誤。
            if(semop(semid,&v_op_buf,1)<0)//以上三行將釋放一個資源給semid代表的信號燈集第一個信號燈
            {
                printf("父進(jìn)程中,semop函數(shù)索取共享資源出現(xiàn)錯誤。\n");
                exit(5);
            }
            else
            {
                printf("ID號為%d的父進(jìn)程中,semop函數(shù)釋放共享資源成功,釋放個數(shù)為:%d\n",getpid(),v_op_buf.sem_op);
                sleep(1);
            }
        }
    }
    else//子進(jìn)程不斷申請共享資源,申請到后聲明一下,然后釋放
    {
        struct sembuf p_op_buf,v_op_buf;
        sleep(2);//等待父進(jìn)程將唯一的資源占用
        printf("子進(jìn)程ID為:%d,該進(jìn)程將要索取共享資源\n",getpid());
        p_op_buf.sem_num=0;
        p_op_buf.sem_op=-1;
        p_op_buf.sem_flg=0;//該標(biāo)志位不用要清零,此處不清零將出現(xiàn)錯誤
        if(semop(semid,&p_op_buf,1)<0)//向semid代表的信號燈集的第一個信號燈申請一個資源,申請不到就一直在這兒等著,什么時候有了資源,什么時候接著向下進(jìn)行
        {
            printf("子進(jìn)程中,semop函數(shù)索取共享資源出現(xiàn)錯誤:%d\n",errno);
            exit(6);
        }
        else
            printf("**********子程序已經(jīng)成功申請到資源!**********\n");
        v_op_buf.sem_num=0;
        v_op_buf.sem_op=1;
        if(semop(semid,&v_op_buf,1)<0)//以上三行將釋放一個資源給semid代表的信號燈集第一個信號燈
        {
            printf("子進(jìn)程中,semop函數(shù)索取共享資源出現(xiàn)錯誤。\n");
            exit(7);
        }
        else
        {
            printf("子進(jìn)程中,semop函數(shù)釋放共享資源成功,釋放個數(shù)為:%d\n",v_op_buf.sem_op);
            printf("ID號為%d的進(jìn)程(子進(jìn)程)退出!\n",getpid());
            if(semctl(semid,0,IPC_RMID,0)<0)
            {
                printf("調(diào)用semctl刪除信號量集出現(xiàn)錯誤。\n");
                exit(8);
            }
            else
            {
                printf("識別代號為%d的信號量集已經(jīng)被刪除\n",semid);
                exit(0);
            }
        }
    }
}
/*********************程序運行結(jié)果*********************
[admin@localhost temp]$ ./sem
ftok函數(shù)轉(zhuǎn)換成功,key值為16802469
semget函數(shù)創(chuàng)建信號燈集成功,信號燈集識別代號semid為:393216
semctl函數(shù)設(shè)置可用資源數(shù)量成功。
父進(jìn)程ID為:4062,該進(jìn)程將要索取共享資源
父進(jìn)程中,semop函數(shù)索取共享資源成功,索取個數(shù)為:1
ID為4062的父進(jìn)程現(xiàn)在要睡上6秒鐘。
4062號進(jìn)程(父進(jìn)程)還要睡6秒鐘……
4062號進(jìn)程(父進(jìn)程)還要睡5秒鐘……
子進(jìn)程ID為:4063,該進(jìn)程將要索取共享資源(但此時唯一的資源被父進(jìn)程所占據(jù),因此一直在此等待資源被釋放)
4062號進(jìn)程(父進(jìn)程)還要睡4秒鐘……
4062號進(jìn)程(父進(jìn)程)還要睡3秒鐘……
4062號進(jìn)程(父進(jìn)程)還要睡2秒鐘……
4062號進(jìn)程(父進(jìn)程)還要睡1秒鐘……
4062號進(jìn)程(父進(jìn)程)已經(jīng)醒來,并將釋放資源。
ID號為4062的父進(jìn)程中,semop函數(shù)釋放共享資源成功,釋放個數(shù)為:1
**********子程序已經(jīng)成功申請到資源!**********(父進(jìn)程釋放資源后,剛才曾經(jīng)提出申請的子進(jìn)程就可以申請到資源了)
子進(jìn)程中,semop函數(shù)釋放共享資源成功,釋放個數(shù)為:1
ID號為4063的進(jìn)程(子進(jìn)程)退出!
識別代號為393216的信號量集已經(jīng)被刪除
***********************************************************/

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
信號量的操作——semop函數(shù)
多進(jìn)程編程的相關(guān)知識總結(jié)(三)
進(jìn)程間通信(IPC):共享內(nèi)存(shared memory)和信號量(semaphore)
Linux進(jìn)程間通信的六種常見方式及代碼實現(xiàn)
獲取信號量信息 利用信號量實現(xiàn)共享資源的申請和釋放
Linux的進(jìn)程通訊之信號量
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服